Java 在多个函数调用中擦除的HashMap值
我使用Java HashMap类作为语言解析器的“缓存”。我将首先简要介绍解析器的背景,然后解释这个问题 每次调用解析函数时,输入都会转换为一组自定义对象,这些对象用语言的语法表示。为了简单起见,我们称之为词语。例如: “红房子” [There,RED,HOUSE](文字列表) 然后在此ArrayList上运行解析算法。为了提高解析器的效率,我们考虑将这个ArrayList对象存储在HashMap中,映射到输出解析器上。每当遇到相同的ArrayList时,我们都可以返回存储的解析 存储过程运行正常。将对象插入HashMap后,HashMap的打印值包含键(ArrayList)和值(Parse)。代码如下:Java 在多个函数调用中擦除的HashMap值,java,parsing,hashmap,Java,Parsing,Hashmap,我使用Java HashMap类作为语言解析器的“缓存”。我将首先简要介绍解析器的背景,然后解释这个问题 每次调用解析函数时,输入都会转换为一组自定义对象,这些对象用语言的语法表示。为了简单起见,我们称之为词语。例如: “红房子” [There,RED,HOUSE](文字列表) 然后在此ArrayList上运行解析算法。为了提高解析器的效率,我们考虑将这个ArrayList对象存储在HashMap中,映射到输出解析器上。每当遇到相同的ArrayList时,我们都可以返回存储的解析 存储过程运行正
this.typeCache.put(WordList, Parse);
其中WordList是ArrayList,Parse是Parse(显然)。稍后,当我尝试从缓存中检索时,系统会识别单词列表是一个键,但它检索的值为null
if (this.typeCache.keySet().contains(WordList)) {
System.out.println("Retrieving from type Cache.");
return this.typeCache.get(WordList);
}
我确保存储值Parse是fieldparse对象的克隆(每次迭代都会更改),因此对象不会更改。也不是每次迭代都会删除HashMap,因为每次调用函数时我都会打印出来,键就留在那里。似乎只是价值观在改变
这有什么原因吗?如果你需要更多信息,请告诉我
编辑:“Parse”值在技术上只是不同可能解析的PriorityQueue。我相信该类已定制为包含“clone”方法,粘贴如下:
public PriorityQueue<E> clone() {
PriorityQueue<E> clonePQ = new PriorityQueue<E>();
clonePQ.size = size;
clonePQ.capacity = capacity;
clonePQ.elements = new ArrayList<E>(capacity);
clonePQ.priorities = new double[capacity];
if (size() > 0) {
clonePQ.elements.addAll(elements);
System.arraycopy(priorities, 0, clonePQ.priorities, 0, size());
}
return clonePQ;
}
public PriorityQueue clone(){
PriorityQueue clonePQ=新的PriorityQueue();
clonePQ.size=尺寸;
clonePQ.capacity=容量;
clonePQ.elements=新阵列列表(容量);
clonePQ.priorities=新的双[容量];
如果(大小()>0){
clonePQ.elements.addAll(elements);
System.arraycopy(priorities,0,clonePQ.priorities,0,size());
}
返回clonePQ;
}
这实际上是直接打印null
,还是仅仅是Parse
的内容?我们可以看到用于克隆它的逻辑吗?您确定您输入的解析
实际上不是null
?尽管它可能不会导致此特定问题,但您可能希望使用对密钥不可变的内容。从这样一个小狙击手身上很难看出问题出在哪里。您可能会看到typeCache.containsKey(WordList)是否给出相同的结果。我改为“containsKey(WordList)”,但结果相同。我可以在这个问题上添加克隆逻辑。我确信我输入的解析不是空的,因为我第一次打印HashMap时,值就会显示出来。但是当这个方法再次被调用时,键保持不变,但是值消失了。由于代码太少,我们不可能找出问题所在。但这只是一个远射:您可能希望尝试克隆单词列表和解析,因为特别是对于键,只要它是ArrayList中的键,就不要修改它是非常重要的。