本当に何が起こるのですか?
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 番目の呼び出しによって再び逆になったためです。set
set
descendingSet()
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