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: 返回this 中包含的元素的相反顺序set

真的会发生什么?

TreeSet固有地用于TreeMap实现其功能。descendingSet()最终调用实例descendingMap()上的函数的调用TreeMap,从以下源代码中可以明显看出:

public NavigableSet<E> descendingSet() {
        return new TreeSet<>(m.descendingMap());
    }

凡人TreeMap普遍持有两种观点:

  • 正常排序视图:使用通用比较器对其元素进行排序
  • 后代地图视图:使用比较器,它强制升序比较器的反向排序。它用于Collections.reverseOrder(m.comparator())返回此降序比较器。

我之所以这样称呼它们view,是因为TreeMap它实际上并没有用它的entry(key, value)创建另一个后代 Map ,而是它维护了两个比较器,彼此施加相反的顺序。descendantMap()调用时第一次创建后代视图。对该函数的任何后续调用都将返回相同的后代 Map 视图。

注意: set.descendingSet().descendingSet()返回一个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
于 2013-10-19T14:18:33.603 回答