我使用Java HashMap类作为语言解析器的“缓存”。我将首先简要介绍解析器,然后解释问题。
每次调用解析函数时,输入都会变成一个自定义对象数组,这些对象用语言的语法表示。为简单起见,我们称之为单词。例如:
“红房子” [THE,RED,HOUSE](单词列表)
然后在此ArrayList上运行解析算法。为了使我们的解析器更有效,我们考虑将这个ArrayList对象存储在HashMap中,映射到输出解析。每当我们遇到相同的ArrayList时,我们就可以返回存储的解析。
存储过程顺利。将对象插入HashMap后,HashMap的打印值包含键(ArrayList)和值(Parse)。代码如下:
this.typeCache.put(WordList, Parse);
其中WordList是ArrayList,而Parse是解析(显然)。稍后,当我尝试从缓存中检索时,系统会识别出WordList是一个键,但它检索的值为null。
if (this.typeCache.keySet().contains(WordList)) {
System.out.println("Retrieving from type Cache.");
return this.typeCache.get(WordList);
}
我确保存储值Parse是字段解析对象的克隆(它会改变每次迭代),因此对象不会改变。这也不是每次迭代都会擦除HashMap,因为我会在每个函数调用时将其打印出来,并且键保留在那里。它似乎只是正在改变的价值观。
这是否会发生这种情况?如果您需要更多信息,请与我们联系。
编辑:“Parse”值在技术上只是不同可能的解析的PriorityQueue。我相信这个类是自定义的,包含一个“克隆”方法,粘贴在下面:
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;
}