List<String> listDataHeader = ...;
Map<String, Integer> ranks = new HashMap<>() ...;
// following causes java.lang.IllegalArgumentException: Comparison method violates its general contract!
Collections.sort(listDataHeader, (o1, o2) -> {
if (ranks.containsKey(o1) && ranks.containsKey(o2))
return ranks.get(o1).compareTo(ranks.get(o2));
else
return 0;
});
如何解决这里的
Comparison method violates its general contract!
错误? ranks
map 中的一些整数可能是相同的值,或者不存在,在这种情况下比较器返回 0,这意味着我不关心这种情况下的顺序。
正如 JTODR 所说,传递性是问题所在。
假设你有:
a -> 1
b -> 2
c not mapped.
然后 a == c 和 b == c 但是 a < b