Трудно добавить пары ключ-значение в мою HashMap - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь использовать HashMap для хранения пар ключ-значение, где ключом является строка Alphanumeri c, а значением является стек другого класса с именем Account. Я пишу код для метода add прямо сейчас, и я столкнулся с проблемой. По какой-то причине код просто останавливается, когда дело доходит до оценки того, существует ли ключ в HashMap.

Что должен сделать метод, это вызвать исключение, если VIN не совпадает с VIN учетной записи объекта, если это не так, следует проверить, находится ли VIN в HashMap, если он is is должен добавить объект account в стек, связанный с VIN, если он не существует, он должен создать стек, добавить значение в стек и добавить пару ключ-стек в HashMap

Вот что я попробовал до сих пор:

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

Пожалуйста, обратите внимание, что я новичок в этом, я только что узнал о HashMaps, и я впервые использую их, любая помощь будет оценена!

** edit: Вот полный код CVR по запросу:

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

1 Ответ

2 голосов
/ 17 апреля 2020

Вы используете жестко закодированную строку "VIN" здесь:

        System.out.println("VIN exists, adding to record");
        records.get("VIN").add(value); 
        System.out.println("Success!");

Это должно было быть значение переменной VIN:

        records.get(VIN).add(value); 

Скорее всего, вы получите исключение NullPointerException выдается, потому что records.get("VIN") вернет null, но ваш обработчик исключений "проглатывает" все исключения без вывода сообщений. Сделайте так, чтобы блок catch напечатал что-нибудь, чтобы в следующий раз вы получили предупреждение.

    catch (Exception e) {
        e.printStackTrace();
    }
...