Java中的NavigableSet及示例
NavigableSet代表Java Collection Framework中的可导航集合。NavigableSet接口继承自SortedSet接口。除了SortedSet的排序机制之外,它行为类似于SortedSet,并且提供导航方法。
例如,NavigableSet接口可以按照与SortedSet中定义的顺序相反的顺序遍历集合。NavigableSet可以按升序或降序访问和遍历。实现这个接口的类有TreeSet和ConcurrentSkipListSet。

这里,E是该集合维护的元素类型。
所有父接口:
Collection<E>, Iterable<E>, Set<E> , SortedSet<E>
所有已知实现类:
ConcurrentSkipListSet , TreeSet<E>
声明: NavigableSet声明如下:
public interface NavigableSet<E> extends SortedSet<E>
创建NavigableSet对象
由于NavigableSet是一个接口,因此不能创建NavigableSet类型的对象。我们需要一个扩展该列表的类来创建对象。并且,自从Java 1.5引入泛型以来,可以限制可以存储在NavigableSet中的对象类型。这个类型安全的集合可以定义为:
// Obj是要存储在NavigableSet中的对象类型
NavigableSet<Obj> set = new TreeSet<Obj> ();
示例:
// Java程序演示NavigableSet的工作
// 导入java.util.NavigableSet和java.util.TreeSet
import java.util.NavigableSet;
import java.util.TreeSet;
public class NavigableSetDemo
{
public static void main(String[] args)
{
//创建NavigableSet对象
NavigableSet<Integer> ns = new TreeSet<>();
ns.add(0);
ns.add(1);
ns.add(2);
ns.add(3);
ns.add(4);
ns.add(5);
ns.add(6);
//获取NavigableSet的反向视图
NavigableSet<Integer> reverseNs = ns.descendingSet();
//打印正常和反向视图
System.out.println("Normal order: " + ns);
System.out.println("Reverse order: " + reverseNs);
NavigableSet<Integer> threeOrMore = ns.tailSet(3, true);
System.out.println("3 or more: " + threeOrMore);
System.out.println("lower(3): " + ns.lower(3));
System.out.println("floor(3): " + ns.floor(3));
System.out.println("higher(3): " + ns.higher(3));
System.out.println("ceiling(3): " + ns.ceiling(3));
System.out.println("pollFirst(): " + ns.pollFirst());
System.out.println("Navigable Set: " + ns);
System.out.println("pollLast(): " + ns.pollLast());
System.out.println("Navigable Set: " + ns);
System.out.println("pollFirst(): " + ns.pollFirst());
System.out.println("Navigable Set: " + ns);
System.out.println("pollFirst(): " + ns.pollFirst());
System.out.println("Navigable Set: " + ns);
System.out.println("pollFirst(): " + ns.pollFirst());
System.out.println("Navigable Set: " + ns);
System.out.println("pollFirst(): " + ns.pollFirst());
System.out.println("pollLast(): " + ns.pollLast());
}
}
输出结果
正序:[0, 1, 2, 3, 4, 5, 6]
倒序:[6, 5, 4, 3, 2, 1, 0]
3 或更多:[3, 4, 5, 6]
更低(3):2
向下取整(3):3
更高(3):4
向上取整(3):3
pollFirst():0
Navigable Set:[1, 2, 3, 4, 5, 6]
pollLast():6
Navigable Set:[1, 2, 3, 4, 5]
pollFirst():1
Navigable Set:[2, 3, 4, 5]
pollFirst():2
Navigable Set:[3, 4, 5]
pollFirst():3
Navigable Set:[4, 5]
pollFirst():4
pollLast():5
对NavigableSet进行各种操作
由于NavigableSet是一个接口,因此它只能与实现此接口的类一起使用。TreeSet是实现NavigableSet接口的类。现在,让我们看看如何在TreeSet上执行一些经常使用的操作。
1. 添加元素: 为了将元素添加到NavigableSet中,我们可以使用add()方法。但是,TreeSet不保留插入顺序。内部使用升序比较并排序每个元素的值。需要注意的是,不允许重复的元素,并且所有重复的元素都将被忽略。并且,NavigableSet不接受空值。
// Java代码演示
//将元素添加到NavigableSet中
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
//使用add()方法添加元素
ts.add("A");
ts.add("B");
ts.add("C");
ts.add("A");
System.out.println(ts);
}
}
输出:
[A, B, C]
2. 访问元素: 添加元素后,如果我们希望访问元素,则可以使用像contains(),first(),last()等内置方法。
- contains()
- first()
- last()
// Java程序访问
//向NavigableSet添加元素
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
//使用add()方法添加元素
ts.add("A");
ts.add("B");
ts.add("C");
ts.add("A");
System.out.println("Navigable Set is " + ts);
String check = "D";
//检查上面的字符串是否存在于NavigableSet中
System.out.println("Contains " + check + " "
+ ts.contains(check));
//打印NavigableSet中的第一个元素
System.out.println("First Value " + ts.first());
//打印NavigableSet中的最后一个元素
System.out.println("Last Value " + ts.last());
}
}
输出:
Navigable Set is [A, B, C]
Contains D false
First Value A
Last Value C
3. 删除值:
可以使用remove(),pollFirst()和pollLast()方法从NavigableSet中删除值。
// Java程序,用于从NavigableSet中删除元素
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
//使用add()方法添加元素
ts.add("A");
ts.add("B");
ts.add("C");
ts.add("B");
ts.add("D");
ts.add("E");
System.out.println("初始TreeSet " + ts);
// 移除元素B
ts.remove("B");
System.out.println("移除元素后 " + ts);
// 移除TreeSet的第一个元素
ts.pollFirst();
System.out.println("移除第一个元素后 " + ts);
// 移除TreeSet的最后一个元素
ts.pollLast();
System.out.println("移除最后一个元素后 " + ts);
}
}
输出:
初始TreeSet [A, B, C, D, E]
移除元素后 [A, C, D, E]
移除第一个元素后 [C, D, E]
移除最后一个元素后 [C, D]
4. 遍历NavigableSet: 有多种遍历NavigableSet的方式。最著名的方法是使用增强的for循环。
// Java程序,遍历NavigableSet
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
//使用add()方法添加元素
ts.add("C");
ts.add("D");
ts.add("E");
ts.add("A");
ts.add("B");
ts.add("Z");
//遍历NavigableSet
for (String value : ts)
System.out.print(value + ", ");
System.out.println();
}
}
输出:
A, B, C, D, E, Z,
Navigable Set的方法
以下是NavigableSet接口中的方法。
| 方法 | 描述 |
|---|---|
| ceiling(E e) | 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回null。 |
| descendingIterator() | 返回此集合中元素的迭代器,按降序排列。 |
| descendingSet() | 返回包含此集合中元素的相反顺序视图。 |
| floor(E e) | 返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回null。 |
| headSet(E toElement) | 返回这个集合中元素严格小于toElement的部分视图。 |
| headSet(E toElement, boolean inclusive) | 返回这个集合中小于(如果inclusive为true,则包括相等的元素)toElement的元素的部分视图。 |
| higher(E e) | 返回此集合中严格大于给定元素的最小元素,如果没有这样的元素,则返回null。 |
| iterator() | 返回此集合中元素的迭代器,按升序排列。 |
| lower(E e) | 返回此集合中严格小于给定元素的最大元素,如果没有这样的元素,则返回null。 |
| pollFirst() | 检索并删除第一个(最低)元素,如果此集合为空,则返回null。 |
| pollLast() | 检索并删除最后一个(最高)元素,如果此集合为空,则返回null。 |
| subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | 返回从fromElement到toElement范围内的部分视图,包含fromElement和toElement。 |
| subSet(E fromElement, E toElement) | 返回从fromElement(包括)到toElement(不包括)范围内的部分视图。 |
| tailSet(E fromElement) | 返回此集合中元素大于或等于fromElement的部分视图。 |
| tailSet(E fromElement, boolean inclusive) | 返回此集合中元素大于(如果inclusive为true,则包括相等的元素)fromElement的部分视图。 |
###
从接口 java.util.SortedSet 继承的方法:
| 方法 | 描述 |
|---|---|
| comparator() | 返回用于对此集合中的元素进行排序的比较器,如果此集合使用其元素的自然顺序,则返回null。 |
| first() | 返回集合中第一个(最低)元素。 |
| last() | 返回集合中最后一个(最高)元素。 |
| spliterator() | 在此排序集合中的元素上创建一个Spliterator。 |
从接口 java.util.Set 继承的方法:
| 方法 | 描述 |
|---|---|
| add(element) | 此方法用于将特定元素添加到该集合中。如果指定元素尚未出现在集合中,则函数仅添加该元素。如果元素已经存在于集合中,则该函数返回False。 |
| addAll(collection) | 此方法用于将指定集合中的所有元素附加到现有集合中。这些元素随机添加,而不遵循任何特定的顺序。 |
| clear() | 此方法用于从集合中删除所有元素,但不删除集合。集合的引用仍然存在。 |
| contains(element) | 此方法用于检查指定元素是否存在于集合中。 |
| containsAll(collection) | 此方法用于检查集合是否包含给定集合中的所有元素。如果集合包含所有元素,则此方法返回True,否则返回False。 |
| equals() | 比较指定对象与此集合是否相等。 |
| hashCode() | 此方法用于获取该集合实例的哈希码值。它返回一个整数值,该值是该集合实例的哈希码值。 |
| isEmpty() | 此方法用于检查NavigableSet是否为空。 |
| remove(element) | 此方法用于从集合中删除给定元素。如果集合中存在指定元素,则此方法返回True,否则返回False。 |
| removeAll(collection) | 此方法用于从集合中删除出现在给定集合中的所有元素。如果此集合在调用后发生更改,则此方法返回True。 |
| retainAll(collection) | 此方法用于保留集合中在给定集合中提到的所有元素。如果此集合在调用后发生更改,则此方法返回True。 |
| size() | 此方法用于获取集合的大小。它返回一个整数值,表示元素的数量。 |
| toArray() | 此方法用于创建与Set相同元素的数组。 |
| toArray(T[] a) | 将包含此集合中所有元素的数组返回;返回的数组的运行时类型与指定数组的类型相同。 |
已声明的java.util.Collection接口方法
| 方法 | 描述 |
|---|---|
| parallelStream() | 返回此集合作为其源的可能并行的Stream。 |
| removeIf(Predicate<? super E> filter) | 删除该集合中满足给定谓词的所有元素。 |
| stream() | 返回此集合作为其源的顺序Stream。 |
| toArray(IntFunction<T[]> generator) | 使用提供的生成器函数分配返回的数组,返回包含此集合中所有元素的数组。 |
已声明的java.lang.Iterable接口方法
| 方法 | 描述 |
|---|---|
| forEach(Consumer<? super T> action) | 对可迭代对象中的每个元素执行给定的操作,直到所有元素已被处理或操作抛出异常为止。 |
极客教程