Collections.sort不工作的Java 1.7

问题描述:

Java 6的使用合并排序两个对象在Collections.sort()而Java 1.7使用TimsortCollections.sort不工作的Java 1.7

我有这个类对象进行排序

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上运行的代码,它正确地排序它,主席来之前表是它的排序是升序排列,这是我想要的。

但其中的代码是用Java 1.7运行时,它不会它在所有排序,表自带椅子前。我检查和1.6使用合并排序,而1.7使用Timsort。请帮我告诉我的代码中有什么问题?

UPDATE 在变量f1 1.7,主席代码执行过程中来,而在1.6表来了!

谢谢!

艾登

+2

尝试一个调试器。另外'返回Integer.valueOf(优先级为1).compareTo(优先级2);' –

+0

我@ElliottFrisch同意。你也可以将这一行改成这个'return(priority1> priority2?1:-1);'而不是0再次返回-1。 – Vucko

+0

但它为什么这样做?请阅读问题底部的UPDATED。是由于1.7版本吗? – Aiden

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

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,你不需要令状e你自己,你可以做

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

谢谢,那么它意味着当priority1小于priority2时,我必须使用-1而不是0? – Aiden

+1

谢谢冠军!将其标记为已回答 – Aiden

+0

@Aiden事实上,我已经更新了我的答案。我建议你有一个单元测试,检查我上面提到的情况。 –