我有两张地图看起来像这样:
{PERSON=[Jack Fisher], ORGANIZATION=[Oriole, American League]}
{LOCATION=[Oriole], PERSON=[Jack Fisher]}
我需要比较它们并为完全匹配、部分匹配和不匹配增加一些计数器。我正在迭代这两张地图及其值,但由于它们不按顺序排列,我的计数都搞砸了。是否可以比较这些地图?如果没有,那么是否有一种解决方法,我可以将它们按顺序排列,然后进行比较。我如何将它们按确切顺序排列?
编辑 - 添加代码
private static List<Integer> compareMaps(LinkedHashMap<String, List<String>> annotationMap,
LinkedHashMap<String, List<String>> rageMap) {
List<Integer> compareResults = new ArrayList<Integer>();
int i_index = 0;
for (Entry<String, List<String>> entry : annotationMap.entrySet()) {
if (rageMap.entrySet().isEmpty()) {
orgFalseNegativeCount++;
continue;
}
for (Entry<String, List<String>> rageEntry : rageMap.entrySet()) {
if (entry.getKey().equals("ORGANIZATION")) {
for (String val : entry.getValue()) {
recusion: for (int i = i_index; i < rageEntry.getValue().size();) {
String rageVal = rageEntry.getValue().get(i);
if (val.equals(rageVal)) {
orgTruePositiveCount++;
i_index++;
break recusion;
}
else if ((val.length() > rageVal.length()) && val.contains(rageVal)) { // ||
// dataB.get(entryA.getKey()).contains(entryA.getValue())){
orgTruePositiveCount++;
i_index++;
break recusion;
} else if ((val.length() < rageVal.length()) && rageVal.contains(val)) {
orgTruePositiveCount++;
i_index++;
break recusion;
}
else if (!val.contains(rageVal)) {
orgFalseNegativeCount++;
i_index++;
break recusion;
} else if (!rageVal.contains(val)) {
orgFalsePositiveCount++;
i_index++;
break recusion;
}
}
}
}
if (entry.getKey().equals("PERSON")) {
for (String val : entry.getValue()) {
recusion: for (int i = i_index; i < rageEntry.getValue().size();) {
String rageVal = rageEntry.getValue().get(i);
if (val.equals(rageVal)) {
perTruePositiveCount++;
i_index++;
break recusion;
}
else if ((val.length() > rageVal.length()) && val.contains(rageVal)) {
perTruePositiveCount++;
i_index++;
break recusion;
}
else if ((val.length() < rageVal.length()) && rageVal.contains(val)) {
perTruePositiveCount++;
i_index++;
break recusion;
}
else if (!val.contains(rageVal)) {
perFalseNegativeCount++;
i_index++;
break recusion;
}
else if (!rageVal.contains(val)) {
perFalsePositiveCount++;
i_index++;
break recusion;
}
}
}
}
}
}
}
你可以使用这样的SortedMap<K,V>
和TreeMap<K,V>
:
SortedMap<String, List<String>> left = new TreeMap<>();
SortedMap<String, List<String>> right = new TreeMap<>();
left .addAll( annotationMap );
right.addAll( rageMap );
compare( left, right );
要比较列表,您可以使用此答案。