本当に何が起こるのですか?
TreeSet本質的TreeMapにその機能を実装するために使用します。次のソース コードから明らかなように、descendingSet()最終的descendingMap()にインスタンスで関数を呼び出すための呼び出し:TreeMap
public NavigableSet<E> descendingSet() {
return new TreeSet<>(m.descendingMap());
}
EveryTreeMapは通常、次の 2 つのビューを維持します。
- 通常のソート ビュー: 一般的なコンパレータを使用してその要素を 並べ替えます
- 子孫マップ ビュー: 昇順コンパレータの逆順を強制するコンパレータを使用します。
Collections.reverseOrder(m.comparator())この降順コンパレータを返すために使用します。
私がこれらを呼び出してviewいるのTreeMapは、実際にはentry(key, value)を持つ別の子孫 Map を作成せず、むしろ 2 つのコンパレータを維持し、互いに反対の順序を課しているためです。descendantMap()が呼び出されたときに、最初に子孫ビューが作成されます。この関数への後続の呼び出しは、同じ子孫のマップ ビューを返します。
注: は、本質的に と同等set.descendingSet().descendingSet()の のビューを返します。最初の呼び出しからの結果のコンパレーターが、 (実際には内部で実行されている)の 2 番目の呼び出しによって再び逆になったためです。setsetdescendingSet()map.descendingMap()
あなたの例を続ける:
System.out.printf("%n Higher than 40 : %s", set.higher(40)); // prints 45
set = set.descendingSet(); // create a reverse ordering
//comparator as described above
System.out.printf("%n Higher than 40 : %s", set.higher(40)); // prints 34
set = set.descendingSet(); // again trying to get descending set!
System.out.printf("%n Higher than 40 : %s", set.higher(40)) // prints 45