JDK-In-Action-TreeSet

TreeSet

基于TreeMapNavigableSet实现. 元素使用它们的自然顺序排序, 或者通过在设置创建时提供的比较器进行排序.内部封装了一个TreeMap,其中每个元素的Value都为相同的Object.
参见: [JDK-In-Action-TreeMap]
这个实现提供的基本操作(add, remove,contains)保证log(n)时间开销.
TreeMap一样,该集合也是非线程安全的,快速失败的.提供的Key需要是可比较的.

API Example

构造函数之 Tree Set

 TreeSet<Integer> src = new TreeSet<>((o1, o2) -> o2 - o1);
 src.addAll(Arrays.asList(1, 3, 5, 7));

 TreeSet<Integer> treeSet = new TreeSet<>(src);
 assertEquals(treeSet, "[7, 5, 3, 1]");

构造函数之比较器

 TreeSet<Integer> treeSet = new TreeSet<>((o1, o2) -> o2 - o1);
 treeSet.addAll(Arrays.asList(1, 3, 5, 7));

 assertEquals(treeSet, "[7, 5, 3, 1]");

构造函数之空 Set

 TreeSet<Integer> treeSet = new TreeSet<>();
 assertEquals(treeSet, "[]");

构造函数之集合源

 List<Integer> src = Arrays.asList(1, 2, 3);
 TreeSet<Integer> treeSet = new TreeSet<>(src);
 assertEquals(treeSet, "[1, 2, 3]");

 Set<Integer> src2 = new HashSet<>(Arrays.asList(1, 2, 3));
 TreeSet<Integer> treeSet2 = new TreeSet<>(src);
 assertEquals(treeSet2, "[1, 2, 3]");

集合操作之 Foreach有序迭代

 TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(0, 3, 1, 8, 7));

 treeSet.forEach(k -> println(k));
0
1
3
7
8

集合操作之 Iterator有序迭代

 TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(0, 3, 1, 8, 7));

 Iterator<Integer> iterator = treeSet.iterator();
 while (iterator.hasNext()) {
     println(iterator.next());
 }
0
1
3
7
8

集合操作之子视图

 TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(0, 1, 3, 5, 7));

 //有序子集 [1,5)
 SortedSet<Integer> subSet = treeSet.subSet(1, 5);
 assertEquals(subSet, "[1, 3]");

 //有序子集 [,5)
 SortedSet<Integer> headSet = treeSet.headSet(5);
 assertEquals(headSet, "[0, 1, 3]");

 //有序子集 [3,)
 SortedSet<Integer> tailSet = treeSet.tailSet(3);
 assertEquals(tailSet, "[3, 5, 7]");

集合操作之新增

 TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(1, 3, 5, 7));

 treeSet.addAll(Arrays.asList(2, 4));
 treeSet.add(6);

 assertEquals(treeSet, "[1, 2, 3, 4, 5, 6, 7]");

集合操作之最小最大

 TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(1, 3, 5, 7));

 Integer first = treeSet.first();
 assertEquals(first, 1);

 //移除并返回最小值
 treeSet.pollFirst();
 assertEquals(treeSet, "[3, 5, 7]");

 Integer last = treeSet.last();
 assertEquals(last, 7);

 //移除并返回最大值
 treeSet.pollLast();
 assertEquals(treeSet, "[3, 5]");

集合操作之有序数组遍历

 TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(0, 3, 1, 8, 7));

 Arrays.stream(treeSet.toArray()).forEach(k -> println(k));
0
1
3
7
8

集合操作之次小次大

 TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(1, 3, 5, 7));


 //集合中第一个小于3的值
 Integer lower = treeSet.lower(3);
 assertEquals(lower, 1);

 //集合中第一个小于等于3的值
 Integer floor = treeSet.floor(3);
 assertEquals(floor, 3);

 //集合中第一个大于5的值
 Integer higher = treeSet.higher(5);
 assertEquals(higher, 7);

 //集合中第一个大于等于5的值
 Integer ceiling = treeSet.ceiling(5);
 assertEquals(ceiling, 5);

引用

  • 源码
  • JDK8 java.util.TreeSet Source Code
posted @ 2020-05-07 16:25  onion94  阅读(151)  评论(0编辑  收藏  举报