当我因为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();
答案 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