您的位置:首页技术文章
文章详情页

java.lang.IllegalArgumentException:比较方法违反了它的一般约定。

浏览:116日期:2024-04-24 13:22:54
如何解决java.lang.IllegalArgumentException:比较方法违反了它的一般约定。?

您的compare()方法 。如果A == B和B == C,则A必须等于C。

现在考虑这种情况:

对于A,B和C,假设containsKey()方法返回以下结果:

childMap.containsKey(A.getID()) 退货 truechildMap.containsKey(B.getID()) 退货 falsechildMap.containsKey(C.getID()) 退货 true

另外,考虑订购A.getId()!= B.getId()。

所以,

A并B返回0,因为外部if条件为false=>A == BB并C返回0,因为外部if条件为false=>B == C

但是,A和C可以根据块内的测试返回-1或。因此,。这违反了传递原则。1``if``A != C

我认为,您应该在else块内添加一些条件,该条件类似于块内的执行检查if。

解决方法

您好,以下是我的比较器的比较方法。我不确定是什么问题。我在堆栈溢出时查找了其他类似标题的问题和答案,但不确定我的方法有什么问题,但我一直在获取java.lang.IllegalArgumentException:比较方法违反了它的一般约定!

任何帮助将不胜感激

public int compare(Node o1,Node o2){ HashMap<Integer,Integer> childMap = orderMap.get(parentID); if(childMap != null && childMap.containsKey(o1.getID()) && childMap.containsKey(o2.getID())) {int order1 = childMap.get(o1.getID());int order2 = childMap.get(o2.getID());if(order1<order2) return -1;else if(order1>order2) return 1;else return 0; } elsereturn 0;}

添加我得到的异常

java.lang.IllegalArgumentException: Comparison method violates its general contract!at java.util.TimSort.mergeLo(TimSort.java:747)at java.util.TimSort.mergeAt(TimSort.java:483)at java.util.TimSort.mergeCollapse(TimSort.java:410)at java.util.TimSort.sort(TimSort.java:214)at java.util.TimSort.sort(TimSort.java:173)at java.util.Arrays.sort(Arrays.java:659)at java.util.Collections.sort(Collections.java:217)

标签: java
相关文章: