将值作为向量的 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
我写这段代码的时候由于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