[英]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.