Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;比较法违反其总合同"E;”寻找小样本数据集_Java_Sorting - Fatal编程技术网

Java &引用;比较法违反其总合同"E;”寻找小样本数据集

Java &引用;比较法违反其总合同"E;”寻找小样本数据集,java,sorting,Java,Sorting,可能重复: 我有一个较大的部分排序数据样本(>700项),我想用Java 7对其进行排序,并得到以下异常: 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 j

可能重复:

我有一个较大的部分排序数据样本(>700项),我想用Java 7对其进行排序,并得到以下异常:

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)
现在,我试图降低数据集的大小,以使查找原因更简单。我已经编写了一个小应用程序,它从较大的集合中选择一个随机子集来重现异常

private static final int SUBSET_SIZE = 32;

public void testSorting() {
    ...
    final Random random = new Random();
    for (int i = 10000000; i-- > 0; ) {
        testFew(strings, random);
    }
}

private void testFew(List<String> strings, Random random) {
    final List<String> list = new ArrayList<String>();
    int index = 0;
    for (int i = 0; i < SUBSET_SIZE; i++) {
        final int rnd = random.nextInt(strings.size() / 100) + 1;
        index = (index + rnd) % strings.size();
        list.add(strings.get(index));
    }

    try {
        Collections.sort(list, MY_COMPARATOR);
    }
    catch (RuntimeException ex) {
        for (String s : list) {
            System.err.println(s);
        }
        throw ex;
    }
}
private static final int SUBSET_SIZE=32;
公共void testSorting(){
...
最终随机数=新随机数();
对于(int i=10000000;i-->0;){
testnow(字符串,随机);
}
}
私有void testnow(列表字符串,随机){
最终列表=新的ArrayList();
int指数=0;
对于(int i=0;i
奇怪的是,如果子集包含至少32个项目,则找到要复制的样本非常简单,但我没有成功地找到更小的集合。嗯,这闻起来更像是排序算法中的错误,而不是比较器中的错误

嗯,这闻起来更像是排序算法中的错误,而不是比较器中的错误

对我来说,这闻起来像是根据输入集的大小使用了两种不同的排序算法

虽然排序实现中存在缺陷并非不可能,但问题更可能出现在比较器中。。。就像异常消息所说的那样。建议您将精力集中在代码上,而不是在库代码中查找(可能不存在)bug

嗯,这闻起来更像是排序算法中的错误,而不是比较器中的错误

对我来说,这闻起来像是根据输入集的大小使用了两种不同的排序算法


虽然排序实现中存在缺陷并非不可能,但问题更可能出现在比较器中。。。就像异常消息所说的那样。建议您将精力集中在代码上,而不是在库代码中查找(可能不存在的)错误。

这意味着您的比较器中有一个错误,
compareTo(a,b)!=-compareTo(b,a)

这意味着您的比较器中有一个bug,
compareTo(a,b)!=-与(b,a)

相比,正如Stephen C已经猜到的,这是使用两种不同排序方法的结果

查看
java.util.TimSort
的代码:

static <T> void sort(T[] a, Comparator<? super T> c) {
    sort(a, 0, a.length, c);
}

static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c) {

    // ...

    // If array is small, do a "mini-TimSort" with no merges
    if (nRemaining < MIN_MERGE) {
        int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
        binarySort(a, lo, hi, lo + initRunLen, c);
        return;
    }

    // ...

static void sort(T[]a,Comparator正如Stephen C已经猜到的,这是使用两种不同排序方法的结果

查看
java.util.TimSort
的代码:

static <T> void sort(T[] a, Comparator<? super T> c) {
    sort(a, 0, a.length, c);
}

static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c) {

    // ...

    // If array is small, do a "mini-TimSort" with no merges
    if (nRemaining < MIN_MERGE) {
        int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
        binarySort(a, lo, hi, lo + initRunLen, c);
        return;
    }

    // ...

static void sort(T[]a,Comparator错误在我们的Comparator中(它违反了aa始终导致stacktrace,这似乎是错误的。

错误在我们的Comparator中是(它违反了aa你能在这里发布你的比较器吗?我打赌1000美元,这个错误在你的代码中,而不是在排序算法中。为什么不发布它的代码,让我们检查它,以及异常的完整堆栈跟踪?你能在这里发布你的比较器吗?I bet$1000表示错误在您的代码中,而不是在排序算法中。为什么不发布代码供我们检查,以及异常的完整堆栈跟踪?不,我已经检查过了。仍然愿意打赌这就是错误所在。您似乎不愿意发布代码以便我们检查。;)不,我已经检查过了。仍然愿意打赌这就是错误所在。你似乎不愿意发布代码以便我们检查。;)嗨,莫特,你能发布你的整套原始比较器和修复的比较器吗。实际上,提出这个问题的原因是,我在prod env中遇到了与String相同的错误,我试图弄清楚它是如何被破坏的。所以不要有数据我的比较器非常简单----new comparator(){public int compare(String str1,String str2){return str1.substring(3).compareTo(str2.substring(3));}}}}-----可能它和yur original一样,但仍然无法找出它是如何破坏传递性的,你能帮我吗?你能帮我把你的全套比较器、原始比较器和固定比较器寄出去吗。实际上,提出这个问题的原因是,我在prod env中遇到了与String相同的错误,我试图弄清楚它是如何被破坏的。所以不要有数据我的比较器非常简单----new comparator(){public int compare(String str1,String str2){return str1.substring(3).compareTo(str2.substring(3));}}}}-----可能它和yur original一样,但仍然无法找出它是如何破坏传递性的,你能帮忙吗