JDK-In-Action-TreeSet
TreeSet
基于TreeMap
的NavigableSet
实现. 元素使用它们的自然顺序排序, 或者通过在设置创建时提供的比较器进行排序.内部封装了一个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