当任何正文按降序排序时,是否可以描述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)?
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)
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |