一、NavigableSet
-
NavigableSet 是 Java 集合框架中的一个接口
-
NavigableSet 继承自 SortedSet,它提供了更强大的导航与搜索功能
-
NavigableSet 允许按升序或降序遍历元素,并支持查找最接近某个元素的元素
-
Java 提供了两个主要的实现:TreeSet(基于红黑树,线程不安全)、ConcurrentSkipListSet(基于跳表,线程安全)
二、NavigableSet 搜索方法
1、基本介绍
E lower(E e);
- lower 方法:返回
< e
的最大元素
E higher(E e);
- 返回
> e
的最小元素
E floor(E e);
- floor 方法:返回
≤ e
的最大元素
E ceiling(E e);
- ceiling 方法:返回
≥ e
的最小元素
2、演示
NavigableSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.add(50);
System.out.println("Lower than 25: " + numbers.lower(25));
System.out.println("Higher than 25: " + numbers.higher(25));
System.out.println("Floor of 25: " + numbers.floor(25));
System.out.println("Ceiling of 25: " + numbers.ceiling(25));
# 输出结果
Lower than 25: 20
Higher than 25: 30
Floor of 25: 20
Ceiling of 25: 30
三、NavigableSet 移除方法
1、基本介绍
E pollFirst();
- pollFirst 方法:移除并返回第一个元素(如果集合为空则返回 null)
E pollLast();
- pollLast 方法:移除并返回最后一个元素(如果集合为空则返回 null)
2、演示
NavigableSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.add(50);
System.out.println("Poll First: " + numbers.pollFirst());
System.out.println("Poll Last: " + numbers.pollLast());
System.out.println("After Poll: " + numbers);
# 输出结果
Poll First: 10
Poll Last: 50
After Poll: [20, 30, 40]
NavigableSet<Integer> numbers = new TreeSet<>();
System.out.println("Poll First: " + numbers.pollFirst());
System.out.println("Poll Last: " + numbers.pollLast());
System.out.println("After Poll: " + numbers);
# 输出结果
Poll First: null
Poll Last: null
After Poll: []
四、NavigableSet 获取子集
1、基本介绍
NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive);
- subSet 方法: 返回 fromElement ~ toElement 范围的子集(可控制是否包含边界)
NavigableSet<E> headSet(E toElement, boolean inclusive);
- headSet 方法:返回
< toElement
的子集(可控制是否包含边界)
NavigableSet<E> tailSet(E fromElement, boolean inclusive);
- tailSet 方法:返回
> fromElement
(可控制是否包含边界)
SortedSet<E> subSet(E fromElement, E toElement);
- subSet 方法: 返回
[fromElement, toElement)
范围的子集
SortedSet<E> headSet(E toElement);
- headSet 方法:返回
< toElement
的子集
SortedSet<E> tailSet(E fromElement);
- tailSet 方法:返回
≥ fromElement
的子集
2、演示
NavigableSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.add(50);
NavigableSet<Integer> subSet = numbers.subSet(20, true, 40, false);
System.out.println("SubSet [20, 40): " + subSet);
NavigableSet<Integer> headSetExclusive = numbers.headSet(30, false);
System.out.println("HeadSet (<30): " + headSetExclusive);
NavigableSet<Integer> headSetInclusive = numbers.headSet(30, true);
System.out.println("HeadSet (≤30): " + headSetInclusive);
NavigableSet<Integer> tailSetExclusive = numbers.tailSet(30, false);
System.out.println("TailSet (>30): " + tailSetExclusive);
NavigableSet<Integer> tailSetInclusive = numbers.tailSet(30, true);
System.out.println("TailSet (≥30): " + tailSetInclusive);
# 输出结果
SubSet [20, 40): [20, 30]
HeadSet (<30): [10, 20]
HeadSet (≤30): [10, 20, 30]
TailSet (>30): [40, 50]
TailSet (≥30): [30, 40, 50]
NavigableSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.add(50);
SortedSet<Integer> subSet = numbers.subSet(20, 40);
System.out.println("SubSet [20, 40): " + subSet);
SortedSet<Integer> headSetExclusive = numbers.headSet(30);
System.out.println("HeadSet (<30): " + headSetExclusive);
SortedSet<Integer> tailSetExclusive = numbers.tailSet(30);
System.out.println("TailSet (≥30): " + tailSetExclusive);
# 输出结果
SubSet [20, 40): [20, 30]
HeadSet (<30): [10, 20]
TailSet (≥30): [30, 40, 50]
五、NavigableSet 其他方法
1、基本介绍
Iterator<E> descendingIterator();
- descendingIterator 方法:返回降序迭代器
NavigableSet<E> descendingSet();
- descendingSet 方法:返回逆序的 NavigableSet
2、演示
NavigableSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(30);
numbers.add(20);
numbers.add(50);
numbers.add(40);
Iterator<Integer> descendingIterator = numbers.descendingIterator();
while (descendingIterator.hasNext()) {
System.out.println(descendingIterator.next());
}
# 输出结果
50
40
30
20
10
NavigableSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.add(50);
NavigableSet<Integer> descendingSet = numbers.descendingSet();
System.out.println(descendingSet);
# 输出结果
[50, 40, 30, 20, 10]