Reputation: 137
I am trying to use a HashMap
to store key value pairs, where the key is an Alphanumeric String and the value is a stack of another class called Account. I writing the code for the add method right now, and I've ran into an issue. For some reason the code just stops when it comes to evaluating whether or not the key already exists in the HashMap
.
What the method should do is throw an exception if the VIN does not match the VIN of the object account, if that is not the case it should check if the VIN is already in the HashMap
, if it is is should add the account object to the stack associated with the VIN, if it does not exist it should create the stack, add the value to the stack and add the key-stack pair to the HashMap
Here's what I've tried so far:
//importing HashMap
import java.util.HashMap;
{
//Creating HashMap
private HashMap<String, Stack<Account>> records;
//add method
public void add(String VIN, Account value) throws Exception
{
if(!VIN.equals(value.getVIN()))
{
System.out.println("Something went wrong :/");
throw new Exception("VIN does not match account");
}
else if(records.containsKey(VIN))
{
System.out.println("VIN exists, adding to record");
records.get("VIN").add(value);
System.out.println("Success!");
}
else
{
System.out.println("New account made, record added!");
Stack<Account> stack = new Stack<Account>();
stack.add(value);
records.put(VIN, stack);
System.out.println("Success!");
}
}
//Driver
public static void main(String[] args)
{
CVR hello= new CVR();
try
{
Account abdcg=new Account("adsj4jandnj4", "abdcg", "perfect record");
Account abdcg1=new Account("adsj4jandnj4","abdcg1", "Fender Bender");
/////
hello.add("adsj4jandnj4", abdcg);
hello.add("adsj4jandnj4", abdcg1);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.getMessage();
}
}
}
Please note I am very new to this, I've only just learned about HashMaps and this is my first time using them, any help would be appreciated!
**edit: Here is the full CVR code as requested:
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Stack;
import java.util.Random;
import java.util.*;
public class CVR
{
//this will be used to generate random alpha numeric numbers
private final static String alphaNumeric="ABDCEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//key
private String VIN;
//threshold (determines which ADT to use)
private int threshold;
//length of key
private int VINLength;
//this is an object of Archive which will hold the data associated with VIN
private Account value;
//TBD
//private Collection<Account> activeVINS;
//HashMap to store all the key-value pairs
//the value come in the form of a stack because,
//multiple events can be associated with the same
//VIN, and must be shown in reverse-chronological order
private HashMap<String, Stack<Account>> records;
//This will keep track of all VINs and make sure
//none of them are repeated
private HashSet<String> VINRecorder;
//default constructor
public CVR() {}
//parameterized constructor for CVR, takes VIN
//and adds it to VINRecorder
public CVR (String VIN)
{
this.VIN=VIN;
records=new HashMap<>();
VINRecorder.add(VIN);
}
//accessors and mutators
//VIN getters and setters
public String getVIN()
{
return VIN;
}
public void setVIN(String VIN)
{
this.VIN=VIN;
VINRecorder=new HashSet<>();
VINRecorder.add(VIN);
}
//threshold getters and setters
public int getThreshold()
{
return threshold;
}
//for this one we have to keep in mind the restriction set
//on us in the instructions
public void setThreshold(int threshold) throws Exception
{
if(threshold<100 || threshold>900000)
{
//System.out.println("Invalid input for threshold");
throw new Exception("Invalid input for threshold");
}
else
{
this.threshold=threshold;
}
}
//VINLength getters and setters
public int getVINLength()
{
return VINLength;
}
//again for this one. we need to take the
//instructions into account for this special
//case
public void setVINLength(int VINLength) throws Exception
{
if(VINLength<10 || VINLength>17)
{
throw new Exception("Invalid input for VIN length");
}
else
{
this.VINLength=VINLength;
}
}
//Now onto the methods
//Generate method
//This method should randomly generate a sequence
//containing n new non-existing valid keys
//***Must determine whether the output is a sequence or not
public String generate(int size) throws Exception
{
char[] Arr= alphaNumeric.toCharArray();
String[] ender=new String[size];
//generating random number between 10 and 17
Random r= new Random();
int low=10;
int high=17;
for(int x=0; x<size;x++)
{
int highLow=r.nextInt(high-low)+10;
StringBuilder newString=new StringBuilder();
//making string between length of 10 and 17 randomly
for(int i=0; i<highLow; i++)
{
newString.append(Arr[new Random().nextInt(Arr.length)]);
}
///////////////////
String newVIN=newString.toString();
//System.out.println(newVIN);
//This must be further explored, I do not know why,
//but for some reason it does not work if the first
//condition is not there, to be explored
if(newVIN!=null)
{
}
//stops here for some reason, must find out why, something is wrong with this statement
else if(VINRecorder.contains(newVIN))
{
x--;
}
else
{
ender[x]=newString.toString();
}
ender[x]=newString.toString();
}
//System.out.println("hello");
System.out.println(Arrays.toString(ender));
return Arrays.toString(ender);
}
//method allKeys
//this method should return all keys as a sorted
//sequence in lexicographic order
//the plan here is to use
/**
public LinkedList<Account> allKeys()
{
}
**/
//add method
//****must check to see if must be resized later
public void add(String VIN, Account value) throws Exception
{
if(!VIN.equals(value.getVIN()))
{
System.out.println("Something went wrong :/");
throw new Exception("VIN does not match account");
}
else if(records.containsKey(VIN))
{
System.out.println("VIN exists, adding to record");
records.get(VIN).add(value);
System.out.println("Success!");
}
else
{
System.out.println("New account made, record added!");
Stack<Account> stack = new Stack<Account>();
stack.add(value);
records.put(VIN, stack);
System.out.println("Success!");
}
}
//driver method
public static void main(String[] args)
{
CVR hello= new CVR();
try
{
//System.out.println("hello");
//hello.generate(5);
Account abdcg=new Account("adsj4jandnj4", "abdcg", "perfect record");
Account abdcg1=new Account("adsj4jandnj4","abdcg1", "Fender Bender");
/////
hello.add("adsj4jandnj4", abdcg);
hello.add("adsj4jandnj4", abdcg1);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Upvotes: 0
Views: 177
Reputation: 111339
You are using a hardcoded string "VIN"
here:
System.out.println("VIN exists, adding to record");
records.get("VIN").add(value);
System.out.println("Success!");
It should have been the value of the variable VIN:
records.get(VIN).add(value);
Most likely you would get a NullPointerException thrown because records.get("VIN")
would return null
but your exception handler "swallows" all exceptions silently. Make the catch block print something so that the next time you'll get a warning.
catch (Exception e) {
e.printStackTrace();
}
Upvotes: 2