2017-02-11 4 views
1

Java 6の用途は1.7私はCollections.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; 
    } 
} 

をソートするオブジェクトのために、このクラスを持っているTimsort

を使用するJavaのに対し、Collections.sort()で2つのオブジェクトを比較するためにマージソートそして私のテストクラスは、議長は、それは私が欲しいの順序を昇順されソートされているテーブルの前に来て、私たちは、Java 1.6でコードを実行すると、それはそれを正しくソート

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.7で実行される場合、コードはまったくソートされません。テーブルはチェアの前にあります。私はチェックし、1.6はマージソートを使用しますが、1.7はTimsortを使用しています。私のコードで何が間違っているのか教えてください。

更新 変数f1の1.7では、椅子がコード実行中に表示されますが、1.6テーブルは表示されます!

ありがとうございます!

エイデン

+2

デバッガを試してみてください。また、 'return Integer.valueOf(priority1).compareTo(priority2);' –

+0

私は@ElliottFrischに同意します。また、この行をこの 'return(priority1> priority2?1:-1);に変更できました。もう一度0の代わりに-1を返します。 – Vucko

+0

しかし、なぜそれをやっているのですか?質問の末尾にあるUPDATEDをお読みください。それは1.7バージョンですか? – Aiden

答えて

4

問題はコンパレータが壊れていることです。コンパイラを持っている場合

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

Java 7がこれを受け入れない理由は次のとおりです。 Java 7では、この条件が満たされているかどうかがさらに確認されます。

彼らは1.7には、Javaを更新しました:(このコードは、今は働いていない:(

それは働いたことはない、それはおそらく正しく並べ替えの前にありませんでしたが、あなたが取得していません。Javaの8にあなたが令状に必要はありません。前にランタイムエラー

短いバージョンで動作します。注

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); 
    } 
} 

(クラスで構築された共通の名前を再使用しないでください)あなたはこれを自分で行うことができます

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

ありがとう、次に、priority1がpriority2より小さい場合、0の代わりに-1を使用しなければならないことを意味しますか? – Aiden

+1

チャンスありがとう! – Aiden

+0

@Aiden確かに、私は自分の答えを更新しました。上記の条件をチェックするユニットテストをお勧めします。 –

関連する問題