TreeSet集合处于降序模式时的高()方法的行为?

Kal*_*her 1 java collections

当任何正文按降序排序时,是否可以描述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));
Run Code Online (Sandbox Code Playgroud)

它返回以下结果即.

Higher than 40 : 34
Run Code Online (Sandbox Code Playgroud)

现在,虽然集合按降序排序,但是higher(40)方法应该返回一个高于40的值(当然是45)?

Sag*_*age 5

  • set.higher(T):function返回此set中的最小元素严格大于给定元素,或者null如果没有这样的元素.

  • set.descendingSet():返回此中view包含的元素的相反顺序set.

真的发生了什么?

TreeSet本质上用于TreeMap实现其功能.调用descendingSet()最终调用实例descendingMap()上的函数TreeMap,如以下源代码所示:

public NavigableSet<E> descendingSet() {
        return new TreeSet<>(m.descendingMap());
    }
Run Code Online (Sandbox Code Playgroud)

每个人都TreeMap保持两种观点:

  • 正常排序视图:使用通用比较器来排序其元素
  • 后代地图视图:使用比较器,它对上升顺序比较器施加反向排序.它用于Collections.reverseOrder(m.comparator())返回这个下降顺序比较器.

我正在调用这些view因为TreeMap实际上没有创建另一个带有它的条目的后代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
Run Code Online (Sandbox Code Playgroud)