我正在查看一些遗留代码,我发现一个部分导致我得到“比较方法违反了它的一般合同!”错误。我知道这个错误是代码不可传递的结果,但我不完全理解如何正确修复它。
以下是导致错误的代码。
private void sortHistories(List<History> histories) {
Collections.sort(histories, new Comparator<History>() {
@Override
public int compare(History o1, History o2) {
return o1 == o2 ? 0
: o1 == null ? -1
: o2 == null ? 1
: o1.getFamilyMembers().equals(o2.getFamilyMembers()) ? 0 //getFamilyMembers() returns a string
: o1.getFamilyMembers() == null ? -1
: o2.getFamilyMembers() == null ? 1
: o2.getFamilyMembers().compareTo(o2.getFamilyMembers()) != 0 ?
o2.getFamilyMembers().compareTo(o2.getFamilyMembers())
: o1.getDisease().equals(o2.getDisease()) ? 0 //getDisease() also returns a string
: o1.getDisease() == null ? -1
: o2.getDisease() == null ? 1
: o1.getDisease().compareTo(o2.getDisease());
}
});
}
最初,在比较字符串==
和equals()
时,代码使用getDisease()
而不是getFamilyMembers()
。我认为从==
更改为equals()
可以解决问题,但事实并非如此。
答案 0 :(得分:2)
感谢HaifengZhang和YoungHobbit的解决方案是:
public int compare(History o1, History o2) {
return o1 == o2 ? 0
: o1 == null ? -1
: o2 == null ? 1
: o1.getFamilyMembers() == null ? -1
: o2.getFamilyMembers() == null ? 1
: o1.getFamilyMembers() == o2.getFamilyMembers() ? 0
: o2.getFamilyMembers().compareTo(o1.getFamilyMembers()) != 0 ?
o2.getFamilyMembers().compareTo(o1.getFamilyMembers())
: o1.getDisease() == null ? -1
: o2.getDisease() == null ? 1
: o1.getDisease() == o2.getDisease() ? 0
: o1.getDisease().compareTo(o2.getDisease());
}
答案 1 :(得分:0)
仔细阅读文档。抛出此异常是一项新的Java7功能。
此处更多详情:: https://stackoverflow.com/a/8327575/3080158
可以使用新的系统属性配置旧行为:java.util.Arrays.useLegacyMergeSort。
http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html