将值作为向量的 LinkedHashMap 被覆盖

LinkedHashMap with values as a vector being overwritten

我写这段代码的时候由于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();
                    }

已编辑代码 将 Vector 替换为 List 并删除了克隆。但是,这仍然不能解决我的问题。这让我回到第一个地方,我的输出是:{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();

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

  • 如果地图包含我们的键,获取列表并添加我们的值
  • 否则,创建一个新列表,添加我们的值,并将列表添加到地图

您遗漏了大部分变量声明,因此我不会尝试向您展示确切的解决方案,但这里是一般公式:

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