相关疑难解决方法(0)

如果我在两个子类中以不同方式覆盖compareTo()会发生什么

我正在尝试重现这篇文章中提到的问题:比较方法违反了它的一般合同

我做的是创建一个父类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函数运行良好,但它给了我一个奇怪的订购.

有人可以帮我吗?谢谢.

java sorting inheritance compareto comparator

1
推荐指数
1
解决办法
142
查看次数

Java7-比较方法违反了其一般约定(TimSort.java)

这是我得到的堆栈跟踪

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。我试图提出一个反例,但我失败了在这里,任何帮助表示赞赏!

java sorting java-7

0
推荐指数
1
解决办法
3529
查看次数

Java Collections.Sort比较方法违反其常规协定

从昨天开始,我的代码中出现错误,我不确定为什么!我在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)

java collections

0
推荐指数
1
解决办法
73
查看次数

比较器错误 java.lang.IllegalArgumentException

如何根据设置位的计数对数组进行排序?我在下面的代码中遇到错误:

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)

如何解决这个问题?

java comparator

0
推荐指数
1
解决办法
57
查看次数