私は、Idと別のフィールドを持つオブジェクトのArrayList(POJO)を持っています。 IdフィールドのPOJOでequals()/ hashcode()オーバーライドを実装しました。 Objectクラスのequals()メソッドを使用して2つのオブジェクトを比較すると、完全に正常に動作します。しかし、これらのオブジェクトをarraylistに追加して実装すると、それは私にクラスを与えます。私は見上げて、コンパレータを実装する必要があることを発見しました。このコンパレータは、/ hashcodeをオーバーライドするために何かを行います。それがそうであれば、なぜ上記のコードはうまくいかないのですか(私はコンパレータがないことを知っていますが、私の質問は、オブジェクトのハッシュコードに基づいてソートを実装できないのですか?)ハッシュコードを使用したオブジェクトのArrayListの並べ替え
2
A
答えて
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
を考えてみましょう。たとえば:
public int hashCode() {
return 1;
}
は、リストは些細な例(空のリスト、単一の要素のリストなど)を除けば、正しくソートされないことはほぼ確実です。
一般的には、java.lang.Object.hashCode javaドキュメントに記載されているhashCode-equalsコントラクトが良いことです。簡単に言えば、hashCodeの衝突によって不等なオブジェクトが生成される可能性があり、それらのメソッドで定義されたソートを無効にすることができます。
関連する問題
- 1. JavaカスタムArrayListオブジェクトの並べ替え
- 2. Javaのコンパレータを使用したArrayListの並べ替え
- 3. Collections並べ替えて両方のArrayListを並べ替える
- 4. オブジェクトのArrayListの並べ替え(並べ替え後に変更されていないArrayList)
- 5. ArrayListを並べ替えるためにeditTextを使用する
- 6. 選択ArrayListを使用して並べ替え
- 7. Javaの姓と名でオブジェクトのArrayListを並べ替える
- 8. オブジェクトのarrayListをJavaのコンポーネントで並べ替えるには
- 9. Javaのオブジェクトのarraylistを並べ替える
- 10. Java:プロパティのオブジェクトのArraylistを並べ替えます。
- 11. WebGridを使用した並べ替え
- 12. PHPを使用した並べ替え
- 13. ArrayListのサイズで並べ替えセット
- 14. arraylistの並べ替えとカテゴリ化
- 15. Java:条件付きでArrayListのオブジェクトを並べ替える
- 16. オブジェクトのプロパティに従ってJava ArrayListを並べ替えます
- 17. C#使用方法パブリッククラスオブジェクトの並べ替え/並べ替え
- 18. 並べ替えオブジェクトのJavascript
- 19. ArrayListを並べ替える - IndexOutOfBoundsException - Java
- 20. ArrayList Collections.sort not sortを並べ替える
- 21. AndroidでArraylistを並べ替えます。
- 22. ハッシュマップでハッシュコードで任意の値を並べ替える方法
- 23. C++の選択並べ替えなし並べ替え並べ替えなし
- 24. RubyでTSortを使用して配列の並べ替えと並べ替え
- 25. オブジェクト内のDateTime変数によるArrayListのオブジェクトの並べ替え
- 26. jQuery Sortableを使用してフォトアルバムを並べ替える(並べ替え)
- 27. 正規表現を使用して文字列のArrayListを並べ替え
- 28. Comparator/ComparableなしのフィールドでオブジェクトのArrayListを並べ替える方法
- 29. 最小のスペース使用のために整列したオブジェクトの並べ替え
- 30. 重複キーを使用してオブジェクトを並べ替える
あなたは間違いなくComparableインターフェイスを実装しようとしています。 'compareTo()'メソッドは実際に何かが別のものより大きいか小さいかを判断するものです。 'equals()'メソッドは、何かが "等しい"かどうかだけを知ることができます。 – gnomed