2012-03-14 10 views
2

私は、Idと別のフィールドを持つオブジェクトのArrayList(POJO)を持っています。 IdフィールドのPOJOでequals()/ hashcode()オーバーライドを実装しました。 Objectクラスのequals()メソッドを使用して2つのオブジェクトを比較すると、完全に正常に動作します。しかし、これらのオブジェクトをarraylistに追加して実装すると、それは私にクラスを与えます。私は見上げて、コンパレータを実装する必要があることを発見しました。このコンパレータは、/ hashcodeをオーバーライドするために何かを行います。それがそうであれば、なぜ上記のコードはうまくいかないのですか(私はコンパレータがないことを知っていますが、私の質問は、オブジェクトのハッシュコードに基づいてソートを実装できないのですか?)ハッシュコードを使用したオブジェクトのArrayListの並べ替え

+0

あなたは間違いなくComparableインターフェイスを実装しようとしています。 'compareTo()'メソッドは実際に何かが別のものより大きいか小さいかを判断するものです。 'equals()'メソッドは、何かが "等しい"かどうかだけを知ることができます。 – gnomed

答えて

5

メッセージには、オブジェクトがソート可能なComparableインターフェイスを実装する必要があることが記載されています。あるいは、sort()メソッドにコンパレータを提供することもできます。たとえば、あなたのオブジェクトは文字列であり、あなたはハッシュコードに基づいてソートする、あなたがこれを行うことが仮定:

public static void main(String[] args) { 
    List<String> list = Arrays.asList("string", "sdkj"); 
    for (String s : list) { 
     System.out.println(s + "=" + s.hashCode()); 
    } 
    Collections.sort(list, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      return o1.hashCode() - o2.hashCode(); 
     } 
    }); 
    System.out.println("After Sorting"); 
    for (String s : list) { 
     System.out.println(s + "=" + s.hashCode()); 
    } 
} 
0

コンパレータはequalsまたはhashcodeに何もしません。equalsまたはhashcodeを使用して、返される内容を判断します。これは、Collections.sortメソッドのドキュメントの一部です。 Comparableインターフェイスを見て、クラスに実装してください。あなたは、例のために、SO質問java class implements comparableを見ることができます。

0

ハッシュコードに基づいて並べ替えを実装することは確かに可能ですが、一貫して希望の動作を生成しない場合があります。たとえば、hashCode()メソッドが常に定数値を返すように定義されているクラスFooを考えてみましょう。たとえば:

このメソッドを使用して定義されたコンパレータと並行して、このhashCodeメソッドを考える
public int hashCode() { 
    return 1; 
} 

は、リストは些細な例(空のリスト、単一の要素のリストなど)を除けば、正しくソートされないことはほぼ確実です。

一般的には、java.lang.Object.hashCode javaドキュメントに記載されているhashCode-equalsコントラクトが良いことです。簡単に言えば、hashCodeの衝突によって不等なオブジェクトが生成される可能性があり、それらのメソッドで定義されたソートを無効にすることができます。

関連する問題