リストTreeSet変換製:"java.lang.ClassCastException:MyClassできなキャストをjava.lang.比較"

StackOverflow https://stackoverflow.com/questions/2504803

  •  22-09-2019
  •  | 
  •  

質問

List<MyClass> myclassList = (List<MyClass>) rs.get();

TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);

かわからないのはなぜこのコードを生成します:

java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable

MyClassな実施に匹敵します。ていただきたいと思い利用がセットにフィルターの独自の要素のリストからリストに含まれてunncessary重複している。

役に立ちましたか?

解決

MyClass implements Comparable<MyClass> はいはいけないと思います。

ない場合、それはそれはいかがでしょうか。

のための TreeSet, することにより、要素 Comparable, 又は提供 Comparator.その他 TreeSet できない機能ではないのです。

この TreeMap implements SortedSet, だい順 の要素があることが明らかになり

まだの方の実施 Comparable 定義 自然順序付け オブジェクトを指定のタイプです。

のインタフェースを定義するように一つの方法 compareTo, これは負の整数、ゼロまたは正の整数の場合このオブジェクトは以下の合成以上にその他のオブジェクトです。

の契約 が必要で

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • その他: x.compareTo(y)>0 && y.compareTo(z)>0 意味 x.compareTo(z)>0
  • x.compareTo(y)==0 ることを sgn(x.compareTo(z)) == sgn(y.compareTo(z)) すべての z

また、 推奨

  • (x.compareTo(y)==0) == (x.equals(y)), ("と整合的 equals

このようにダイジェストが本当にこれは自然との どのように一定の合計。


場合にオブジェクトは順序のひとりで、 TreeSet 思うです。ご利用について HashSet 代わりに、独自に契約します。する必要があ @Override hashCode()equals(Object) 適切なタイプ(参照: オequalsおよびhashCodeはJava)

他のヒント

あなたはComparatorへの明示的なTreeSetを渡さない場合は、

、それが(彼らはComparableあると仮定して)オブジェクトを比較しようとします。彼らはComparableない場合は、この例外がスローされるように、それは、それらを比較することはできません!
TreeSetsはセットをソートし、どちらかComparableまたはComparatorSet内のオブジェクトをソートする方法を決定するために渡されるようにオブジェクトを必要とされます。

それがランダムに表示された方法でHashSetによって返されたオブジェクトの順序をシャッフルしますが、

あなただけのセットは、重複を削除したい場合は、Iteratorを使用。
あなたは、多少の使用LinkedHashSetを順序を保持したい場合しかし、それは少なくともリストの挿入順序を保持します。

TreeSetのオブジェクトの実装によって、またはSetコンストラクタに渡されたカスタムComparableのいずれかによって、ソートあなたがComparatorが必要な場合は、

TreeSet'sのみを充当されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top