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)
相关文章:
