2011-08-06 14 views
3

カスタムのコンパレータを作成して、ArrayList of Stringsを並べ替えました。私はデバッガを介してそれを実行し、比較し、値を正しく返すのを見ました。しかし、私の配列はソートされていません。私がJava & Androidを初めて使用して以来、何か他のことが起こっている可能性があります。カスタムコンパレータを使用したコレクションの並べ替えが機能しない

それを数時間見た後、私は何かを理解することができません。私はこのサイトを使って多くの他の質問に答えています。

Collections.sort(allWords, new Comparator<String>(){ 
     public int compare(String o1, String o2) { 
      scoreWord sc1 = new scoreWord((String)o1); 
      scoreWord sc2 = new scoreWord((String)o2); 
      int i1 = sc1.getScore(); 
      int i2 = sc2.getScore(); 
      if (i1 > i2) 
       return 1; 
      return 0; 
     } 

     public boolean equals(String o1, String o2) { 
      scoreWord sc1 = new scoreWord((String)o1); 
      scoreWord sc2 = new scoreWord((String)o2); 
      int i1 = sc1.getScore(); 
      int i2 = sc2.getScore(); 
      if (i1 == i2) 
       return true; 
      return false; 
     } 
    }); 
+0

どのような理由で 'equals(String o1、String o2)'メソッドが必要ですか? – home

+0

'compare(Object o1、Object o2)'と 'equals(Object o1、Object o2) 'を試してください –

答えて

18

あなたcompare方法は左右対称ではありません - 常にどちらか、それはあなたが使用しているJavaのバージョンで利用できる場合だけ(Integer.compareに委任し、代わりに、1または0

を返します。 )、スコアを渡す:

public int compare(String o1, String o2) { 
    scoreWord sc1 = new scoreWord((String)o1); 
    scoreWord sc2 = new scoreWord((String)o2); 
    return Integer.compare(i1, i2); 
} 

そうでない場合は率直に言って、痛みで手でそれを行う - あなたが複数の場所でこれを必要とする場合、私は、W君を提案

public int compare(String o1, String o2) { 
    scoreWord sc1 = new scoreWord((String)o1); 
    scoreWord sc2 = new scoreWord((String)o2); 
    return i1 > i2 ? 1 
     : i1 < i2 ? -1 
     : 0; 
} 

あなたは適切な対称性があります。この方法:

  • a.compareTo(b) < 0b.compareTo(a) > 0
  • a.compareTo(b) > 0意味b.compareTo(a) < 0
  • a.compareTo(b) == 0b.compareTo(a) == 0
  • を暗示暗示を繰り返しを避けるために、 Integer.compareの独自の実装を儀式
10

このお試しください:最初の引数が少ないよう 負の整数、ゼロ、または正の整数:

リターン:あなたのコンパレータは、に似て何かを返す必要があります

public int compare(String o1, String o2) { 
     scoreWord sc1 = new scoreWord((String)o1); 
     scoreWord sc2 = new scoreWord((String)o2); 
     int i1 = sc1.getScore(); 
     int i2 = sc2.getScore(); 
     if (i1 > i2) { 
      return 1; 
     } else if (i1 < i2) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 
+0

ありがとうございます。これは、大学のコーディングがあなたに...ソートアルゴリズムがT/Fを比較する必要があるという前提です:( – Richard

+0

@ user882173:plsは "T/F"の意味を教えてくれますか? – home

+0

T/F - True /偽 – Ankit

1

をより大きい、等しい、または大きいです。

Source

関連する問題