Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个函数调用中擦除的HashMap值_Java_Parsing_Hashmap - Fatal编程技术网

Java 在多个函数调用中擦除的HashMap值

Java 在多个函数调用中擦除的HashMap值,java,parsing,hashmap,Java,Parsing,Hashmap,我使用Java HashMap类作为语言解析器的“缓存”。我将首先简要介绍解析器的背景,然后解释这个问题 每次调用解析函数时,输入都会转换为一组自定义对象,这些对象用语言的语法表示。为了简单起见,我们称之为词语。例如: “红房子” [There,RED,HOUSE](文字列表) 然后在此ArrayList上运行解析算法。为了提高解析器的效率,我们考虑将这个ArrayList对象存储在HashMap中,映射到输出解析器上。每当遇到相同的ArrayList时,我们都可以返回存储的解析 存储过程运行正

我使用Java HashMap类作为语言解析器的“缓存”。我将首先简要介绍解析器的背景,然后解释这个问题

每次调用解析函数时,输入都会转换为一组自定义对象,这些对象用语言的语法表示。为了简单起见,我们称之为词语。例如:

“红房子” [There,RED,HOUSE](文字列表)

然后在此ArrayList上运行解析算法。为了提高解析器的效率,我们考虑将这个ArrayList对象存储在HashMap中,映射到输出解析器上。每当遇到相同的ArrayList时,我们都可以返回存储的解析

存储过程运行正常。将对象插入HashMap后,HashMap的打印值包含键(ArrayList)和值(Parse)。代码如下:

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中的键,就不要修改它是非常重要的。