Java 将值作为向量的LinkedHashMap被覆盖

Java 将值作为向量的LinkedHashMap被覆盖,java,linkedhashmap,Java,Linkedhashmap,当我写这段代码时,由于pnValue.clear();我得到的输出是键的空值。因此,我在某个地方读到,将一个映射的值添加到另一个映射只是对原始映射的引用,必须使用clone()方法来确保两个映射是分开的。现在,克隆映射后我面临的问题是,如果某个键有多个值,那么它们就被过度写入了。例如,我希望通过处理gold句子得到的输出是: {PERSON = [James Fisher],ORGANIZATION=[American League, Chicago Bulls]} 但我得到的是: {PERS

当我写这段代码时,由于pnValue.clear();我得到的输出是键的空值。因此,我在某个地方读到,将一个映射的值添加到另一个映射只是对原始映射的引用,必须使用clone()方法来确保两个映射是分开的。现在,克隆映射后我面临的问题是,如果某个键有多个值,那么它们就被过度写入了。例如,我希望通过处理gold句子得到的输出是:

{PERSON = [James Fisher],ORGANIZATION=[American League, Chicago Bulls]}
但我得到的是:

{PERSON = [James Fisher],ORGANIZATION=[Chicago Bulls]}
考虑到我将我的值声明为
向量


你在尝试一堆东西,却没有真正思考背后的逻辑。不需要清除或克隆任何内容,您只需要为单独的密钥管理单独的列表。以下是每个新值的基本过程:

  • 如果地图包含我们的密钥,则获取列表并添加我们的值
  • 否则,创建一个新列表,添加我们的值,并将该列表添加到地图中
您省略了大部分变量声明,因此我不会尝试向您展示确切的解决方案,但以下是一般公式:

List<String> list = map.get(key);  // try to get the list
if (list == null) {                // list doesn't exist?
    list = new ArrayList<>();      // create an empty list
    map.put(key, list);            // insert it into the map
}
list.add(value);                   // update the list
List List=map.get(key);//试着获取列表
如果(list==null){//list不存在?
list=new ArrayList();//创建一个空列表
map.put(key,list);//将其插入到映射中
}
列表。添加(值);//更新列表

您一直在调用
pnValue.clear()
。你永远不会在那里得到超过1个项目。为什么你要在修改向量后进行克隆,通常你只是在修改之前复制一份,或者这可能是毫无意义的。此外,我还建议使用1997年之后的集合,例如ArrayList。如果我不调用pnValue.clear(),我得到的输出是{PERSON=[James Fisher,American League,Chicago Bulls],ORGANIZATION=[James Fisher,American League,Chicago Bulls]}@PeterLawrey,我以前从未使用过克隆()。如何编辑代码以正确使用它?@serendipity通常使用
close()
的最佳方法是根本不使用它。
for(WSDSentence goldSentence : goldSentences)
        {   
            for (WSDElement word : goldSentence.getWsdElements()){
                if (word.getPN()!=null){
                    if (word.getPN().equals("group")){
                        String newPNTag = word.getPN().replace("group", "organization");
                        pnValue.add(word.getToken().replaceAll("_", " "));
                        newPNValue = (List<String>) pnValue;
                        annotationMap.put(newPNTag.toUpperCase(),newPNValue);

                    }


                    else{

                        pnValue.add(word.getToken().replaceAll("_", " "));
                        newPNValue =  pnValue;
                        annotationMap.put(word.getPN().toUpperCase(),newPNValue);

                    }

                }

                sentenceAnnotationMap =  annotationMap;

            }
            pnValue.clear();
List<String> list = map.get(key);  // try to get the list
if (list == null) {                // list doesn't exist?
    list = new ArrayList<>();      // create an empty list
    map.put(key, list);            // insert it into the map
}
list.add(value);                   // update the list