LinkedHashMap,其值为被覆盖的向量

时间:2017-02-12 11:40:38

标签: java linkedhashmap

当我因为pnValue.clear()而编写这段代码时;我得到的输出是键的空值。所以我在某处读到,将一个地图的值添加到另一个地图仅仅是对原始地图的引用,并且必须使用clone()方法来确保两个地图是分开的。现在克隆我的地图后我遇到的问题是,如果我有一个特定键的多个值,那么它们就被覆盖了。例如。我期望处理goldSentence的输出是:

{PERSON = [James Fisher],ORGANIZATION=[American League, Chicago Bulls]}

但我得到的是:

{PERSON = [James Fisher],ORGANIZATION=[Chicago Bulls]}

我想知道我在哪里出错了,因为我将我的价值宣布为Vector<String>

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 = (Vector<String>) pnValue.clone();
                                annotationMap.put(newPNTag.toUpperCase(),newPNValue);

                            }


                            else{

                                pnValue.add(word.getToken().replaceAll("_", " "));
                                newPNValue = (Vector<String>) pnValue.clone();
                                annotationMap.put(word.getPN().toUpperCase(),newPNValue);

                            }

                        }

                        sentenceAnnotationMap = (LinkedHashMap<String, Vector<String>>) annotationMap.clone();
                        pnValue.clear();
                    }

已编辑的代码 用List替换了Vector并删除了克隆。然而,这仍然无法解决我的问题。这会让我回到原点,我的输出是:{PERSON=[], ORGANIZATION=[]}

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();

1 个答案:

答案 0 :(得分:0)

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

  • 如果地图包含我们的密钥,请获取列表并添加我们的值
  • 否则,请创建新列表,添加我们的值,然后将列表添加到地图

你遗漏了大部分的变量声明,所以我不会试图向你展示确切的解决方案,但这里是通用公式:

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