aのAComparator
は、TreeSet
CCEのスローではなく、注文に使用されます。コンパレータは1
すべてを返すように設計されているため、順序が正しくないことを意味します。
これが、出力が順序付けられていない理由です。
のコンストラクタのドキュメントを必ずお読みくださいTreeSet
。
/**
* Constructs a new, empty tree set, sorted according to the specified
* comparator. All elements inserted into the set must be <i>mutually
* comparable</i> by the specified comparator: {@code comparator.compare(e1,
* e2)} must not throw a {@code ClassCastException} for any elements
* {@code e1} and {@code e2} in the set. If the user attempts to add
* an element to the set that violates this constraint, the
* {@code add} call will throw a {@code ClassCastException}.
*
* @param comparator the comparator that will be used to order this set.
* If {@code null}, the {@linkplain Comparable natural
* ordering} of the elements will be used.
*/
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
Comparator
が設計されている要素以外の要素を追加しようとすると、がスローされることを明確に示していますClassCastException
。ジェネリックを使用しない場合は、を追加してこれをシミュレートできますString
。ただし、ジェネリックスを使用する場合、これはコンパイル時の問題にすぎません。
その間、ジェネリックを一貫して使用する必要があります。
class NumberComparator<C> implements Comparator<C> {
public int compare(C o1, C o2) {
return 1; // change this logic
}
}
Set<Number> set = new TreeSet<>(new NumberComparator<Number>());