简体   繁体   中英

Having difficulty adding key-value pairs to my HashMap

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();
        }
    }
}

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();
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM