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
Collections.sort不适用于java 1.7_Java_Sorting_Collections_Comparator - Fatal编程技术网

Collections.sort不适用于java 1.7

Collections.sort不适用于java 1.7,java,sorting,collections,comparator,Java,Sorting,Collections,Comparator,Java6使用合并排序来比较Collections.sort中的两个对象,而Java1.7使用Timsort 我有这个类来对对象进行排序 Class ObjectSort { String Name = ""; int priority = 0; public ObjectSort (String name, int priority) { this.Name = Name; this.priority = priority;

Java6使用合并排序来比较Collections.sort中的两个对象,而Java1.7使用Timsort

我有这个类来对对象进行排序

Class ObjectSort 
{
    String Name = "";
    int priority = 0;

    public ObjectSort (String name, int priority)
    {
        this.Name = Name;
        this.priority = priority;
    }

    public getPriority()
    {
        return priority;
    }
}
我的测试班是

TestClass 
{
     ...main()
    {
      List<ObjectSort> sorted = new ArrayList<ObjectSort> ();
      sorted.add ("Table", 99);
      sorted.add ("Chair", 1);
      Collections.sort(sorted, new Comparator ());
    }

 // inner class to define comparator logic
 private static final class Comparator implements  java.util.Comparator<ObjectSort>
 {
    @Override
    public int compare (ObjectSort f1, ObjectSort f2)
    {
        try
        {
            // Get the allocation priorities
            int priority1 = f1.getPriority ();
            int priority2 = f2.getPriority ();

            if (priority1 == priority2)
                return 0;
            else
                return (priority1 > priority2 ? 1 : 0);
        }
        catch (Exception e)
        {
            // Shouldn't happen, because we have the objects OK and there's no database activity
            // happening here.
            assert true;
        }
        return 0;
    }
}

}
现在,当我们在Java1.6中运行代码时,它正确地对它进行排序,椅子放在表的前面,也就是说,它在排序,它是升序,这是我想要的

但当代码在Java1.7中运行时,它根本不会对其进行排序,而是将表放在椅子前面。我检查了,1.6使用合并排序,而1.7使用Timsort。请帮我说出我的代码中有什么错误

更新 在变量f1的1.7中,Chair在代码执行期间出现,而在1.6中Table出现

谢谢


艾登:问题是你的比较器坏了。当你有一个比较器

comparator.compare(a, b) == -comparator.compare(b, a)
Java7不接受这一点的原因是;Java7有更多的检查来证明这个条件是真的

他们已经将java更新为1.7:并且该代码现在在那里不起作用:

它从未工作过,以前可能没有正确排序,但您以前没有遇到运行时错误

一个简短的版本将工作是;不要重用公共内置类的名称

static class ObjectSortComparator implements Comparator<ObjectSort> {
    @Override
    public int compare (ObjectSort f1, ObjectSort f2) {
        // Get the allocation priorities
        int priority1 = f1.getPriority ();
        int priority2 = f2.getPriority ();

        return priority1 == priority2 ? 0 : (priority1 > priority2 ? 1 : -1);
    }
}

问题是你的比较器坏了。当你有一个比较器

comparator.compare(a, b) == -comparator.compare(b, a)
Java7不接受这一点的原因是;Java7有更多的检查来证明这个条件是真的

他们已经将java更新为1.7:并且该代码现在在那里不起作用:

它从未工作过,以前可能没有正确排序,但您以前没有遇到运行时错误

一个简短的版本将工作是;不要重用公共内置类的名称

static class ObjectSortComparator implements Comparator<ObjectSort> {
    @Override
    public int compare (ObjectSort f1, ObjectSort f2) {
        // Get the allocation priorities
        int priority1 = f1.getPriority ();
        int priority2 = f2.getPriority ();

        return priority1 == priority2 ? 0 : (priority1 > priority2 ? 1 : -1);
    }
}

尝试调试器。另外,返回Integer.valueOfpriority1.compareTopriority2;我同意埃利奥特弗里希的观点。您还可以将此行更改为返回优先级1>优先级2?1 : -1; 再次返回-1而不是0。但它为什么这样做呢?请阅读问题底部的更新内容。这是由于1.7版本吗?请使用调试器逐步了解原因。但基本上是的,合并排序和timsort是不同的算法,它们的行为也不同。快速排序、计数排序和选择排序也是如此。为什么你会对它们不完全相同感到惊讶?而且,Java1.7已经快两年了为什么要询问此行为?@Aiden您的比较器不遵循约定,它有时会返回1进行比较,但会返回0进行反向比较。请尝试调试器。另外,返回Integer.valueOfpriority1.compareTopriority2;我同意埃利奥特弗里希的观点。您还可以将此行更改为返回优先级1>优先级2?1 : -1; 再次返回-1而不是0。但它为什么这样做呢?请阅读问题底部的更新内容。这是由于1.7版本吗?请使用调试器逐步了解原因。但基本上是的,合并排序和timsort是不同的算法,它们的行为也不同。快速排序、计数排序和选择排序也是如此。为什么你会对它们不完全相同感到惊讶?而且,Java1.7已经快两年了你为什么要问这种行为?@Aiden你的比较器不遵循约定,它有时会返回1进行比较,但它会返回0进行反向比较。谢谢,这意味着当优先级1小于优先级2时,我必须使用-1而不是0?@Aiden确实,我已经更新了我的答案。我建议您使用一个单元测试来检查我上面提到的条件。@Aiden注意:您不需要捕获异常并忽略它。最好让它抛出最初的异常,虽然这不应该发生在其他情况下,但这意味着当优先级1小于优先级2时,我必须使用-1而不是0?@Aiden确实,我已经更新了我的答案。我建议您使用一个单元测试来检查我上面提到的条件。@Aiden注意:您不需要捕获异常并忽略它。最好让它抛出原始异常,尽管这也不应该发生