我正在尝试重现这篇文章中提到的问题:比较方法违反了它的一般合同
我做的是创建一个父类A,它有自己的compareTo()函数,然后我创建了一个类B继承自类A,并覆盖compareTo(),如:
public int compareTo(Object o) { return super.compareTo(o);}
Run Code Online (Sandbox Code Playgroud)
另一个C类也继承自A类,并将compareTo()重写为:
public int compareTo(Object o) { return -super.compareTo(o);}
Run Code Online (Sandbox Code Playgroud)
所以我列出了一堆B/C类对象,并使用Collections.sort()对它们进行排序,但是我没有看到前一篇文章中提到的Exception,sort函数运行良好,但它给了我一个奇怪的订购.
有人可以帮我吗?谢谢.
这是我得到的堆栈跟踪
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:777)
at java.util.TimSort.mergeAt(TimSort.java:514)
at java.util.TimSort.mergeCollapse(TimSort.java:441)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at xxx.sortDisplayFields(OfferFieldLayout.java:521)
Run Code Online (Sandbox Code Playgroud)
这是比较方法:
public int compare(Field pObject1, Field pObject2)
{
int compare = 0;
//...
if (compare == 0)
{
if (pObject1.hashCode() <= pObject2.hashCode())
{
compare = -1;
}
else
{
compare = 1;
}
}
return compare;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是由于不尊重传递性而导致的:传递性:如果A> B和B> C,那么对于任何A,B和C:A>C。我试图提出一个反例,但我失败了在这里,任何帮助表示赞赏!
从昨天开始,我的代码中出现错误,我不确定为什么!我在Google上搜索了很多,然后找到了此 Stack-Post。
我使用此功能按名称对用户进行排序并创建日期。该功能已经运行了2年,现在我遇到了一个用户错误,我不知道发生了什么变化。我尝试检查我的数据是否有损坏,但找不到任何错误。
在阅读了Stack-Post之后,我仍然不完全了解问题所在或项目中发生了什么变化。
public void sortUsers(List<Users> sortList) {
Collections.sort(sortList, new Comparator<Users>() {
public int compare(Users user1, Users user2) {
Integer comp = 0;
comp = user1.getUsername().compareTo(user2.getUsername());
if (comp == 0) {
comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;
}
return comp;
}
});
}
Run Code Online (Sandbox Code Playgroud) 如何根据设置位的计数对数组进行排序?我在下面的代码中遇到错误:
Arrays.sort(arr, (o1, o2) -> {
if (Integer.bitCount(o1) <= Integer.bitCount(o2))
return 1;
return -1;
});
Run Code Online (Sandbox Code Playgroud)
例外:
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.base/java.util.TimSort.mergeLo(TimSort.java:781)
at java.base/java.util.TimSort.mergeAt(TimSort.java:518)
at java.base/java.util.TimSort.mergeCollapse(TimSort.java:448)
at java.base/java.util.TimSort.sort(TimSort.java:245)
at java.base/java.util.Arrays.sort(Arrays.java:1441)
at Compute.sortBySetBitCount(File.java:44)
at GFG.main(File.java:23)
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?