リストTreeSet変換製:"java.lang.ClassCastException:MyClassできなキャストをjava.lang.比較"
-
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
またはComparator
はSet
内のオブジェクトをソートする方法を決定するために渡されるようにオブジェクトを必要とされます。
HashSet
によって返されたオブジェクトの順序をシャッフルしますが、あなただけのセットは、重複を削除したい場合は、Iterator
を使用。
あなたは、多少の使用LinkedHashSet
を順序を保持したい場合しかし、それは少なくともリストの挿入順序を保持します。
TreeSet
のオブジェクトの実装によって、またはSet
コンストラクタに渡されたカスタムComparable
のいずれかによって、ソートあなたがComparator
が必要な場合は、 TreeSet's
のみを充当されます。