Collections.sort无法在java 1.7上运行

时间:2017-02-11 13:46:55

标签: java sorting collections comparator

Java 6使用合并排序来比较Collections.sort()中的两个对象,而Java 1.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;
    }
}

}

现在当我们在java 1.6中运行代码时,它正确地对它进行排序,主席来到BEFORE表,它正在排序它是ASCENDING顺序,我想要它。

但是,如果代码在Java 1.7中运行,它根本不对它进行排序,Table在Chair之前出现。我检查过,1.6使用合并排序,而1.7使用Timsort。请帮我告诉我的代码有什么问题?

UPDATE 在1.7中的变量f1中,Chair在代码执行期间出现,而在1.6表中来了!

谢谢!

艾登

1 个答案:

答案 0 :(得分:5)

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

comparator.compare(a, b) == -comparator.compare(b, a)

Java 7不接受这个的原因是; Java 7有更多检查,表明这种情况属实。

  

他们已将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);
    }
}

注意:在Java 8中,您不需要自己编写,您可以

sorted.sort(Comparator.comparingInt(ObjectSort::getPriority));