繁体   English   中英

难以将键值对添加到我的 HashMap

[英]Having difficulty adding key-value pairs to my HashMap

我正在尝试使用HashMap来存储键值对,其中键是字母数字字符串,值是另一个名为 Account 的 class 的堆栈。 我现在正在为 add 方法编写代码,但遇到了一个问题。 由于某种原因,代码在评估HashMap中是否已经存在时停止。

如果 VIN 与 object 帐户的 VIN 不匹配,该方法应该做的是抛出异常,如果不是这种情况,它应该检查 VIN 是否已经在HashMap中,如果是应该添加帐户 ZA8CFDE6331BD4B662AC1与 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,这是我第一次使用它们,任何帮助将不胜感激!

**编辑:这是所要求的完整 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();
        }
    }
}

您在此处使用硬编码字符串"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 records.get("VIN")会返回null但您的异常处理程序会默默地“吞下”所有异常。 让 catch 块打印一些东西,以便下次你会收到警告。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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