1

降順でソートされたときの TreeSet コレクションの higher() メソッドのこの動作を説明できるボディはありますか?

コード:

NavigableSet<Integer> set = new TreeSet<>();

set.add(10);
set.add(22);
set.add(34);
set.add(40);
set.add(45);
set.add(56);
set.add(77);
set.add(79);
set.add(84);
set.add(99);

set = set.descendingSet();

System.out.printf("%n Higher than 40 : %s", set.higher(40));

次の結果を返します。

Higher than 40 : 34

さて、コレクションは降順でソートされますが、higher(40)メソッドは 40 より大きい値 (もちろん 45 です) を返す必要がありますか?

4

1 に答える 1

5
  • set.higher(T): 関数は、指定された要素より厳密に大きい、このセット内の最小の要素を返すか、nullそのような要素がない場合に返します。

  • set.descendingSet()view:この に含まれる要素の逆順を返しますset

本当に何が起こるのですか?

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
于 2013-10-19T14:18:33.603 に答える