Java NavigableSet与实例
NavigableSet在Java集合框架中表示一个可导航的集合。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 program to demonstrate
// the working of NavigableSet
import java.util.NavigableSet;
import java.util.TreeSet;
public class NavigableSetDemo
{
public static void main(String[] args)
{
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);
// Get a reverse view of the navigable set
NavigableSet<Integer> reverseNs = ns.descendingSet();
// Print the normal and reverse views
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());
}
}
输出
Normal order: [0, 1, 2, 3, 4, 5, 6]
Reverse order: [6, 5, 4, 3, 2, 1, 0]
3 or more: [3, 4, 5, 6]
lower(3): 2
floor(3): 3
higher(3): 4
ceiling(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 code to demonstrate
// adding of elements in
// NavigableSet
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
// Elements are added using add() method
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 program to access
// the elements of NavigableSet
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
// Elements are added using add() method
ts.add("A");
ts.add("B");
ts.add("C");
ts.add("A");
System.out.println("Navigable Set is " + ts);
String check = "D";
// Check if the above string exists in
// the NavigableSet or not
System.out.println("Contains " + check + " "
+ ts.contains(check));
// Print the first element in
// the NavigableSet
System.out.println("First Value " + ts.first());
// Print the last element in
// the 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中删除数值。
- remove()
- pollFirst()
- pollLast()
// Java Program to remove the
// elements from NavigableSet
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
// Elements are added using add() method
ts.add("A");
ts.add("B");
ts.add("C");
ts.add("B");
ts.add("D");
ts.add("E");
System.out.println("Initial TreeSet " + ts);
// Removing the element b
ts.remove("B");
System.out.println("After removing element " + ts);
// Remove the First element of TreeSet
ts.pollFirst();
System.out.println(
"After the removal of First Element " + ts);
// Remove the Last element of TreeSet
ts.pollLast();
System.out.println(
"After the removal of Last Element " + ts);
}
}
输出
Initial TreeSet [A, B, C, D, E]
After removing element [A, C, D, E]
After the removal of First Element [C, D, E]
After the removal of Last Element [C, D]
4.遍历NavigableSet: 有各种方法来遍历NavigableSet。最著名的是使用增强的for循环。
// Java program to iterate
// through NavigableSet
import java.util.*;
import java.io.*;
class NavigableSetDemo {
public static void main(String[] args)
{
NavigableSet<String> ts = new TreeSet<String>();
// Elements are added using add() method
ts.add("C");
ts.add("D");
ts.add("E");
ts.add("A");
ts.add("B");
ts.add("Z");
// Iterating though the NavigableSet
for (String value : ts)
System.out.print(value + ", ");
System.out.println();
}
}
输出
A, B, C, D, E, Z,
可导航集的方法
以下是NavigableSet接口中的方法。
方法 | 描述 |
---|---|
ceiling(E e) | 返回这个集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回空。 |
descendingIterator() | 返回这个集合中的元素的迭代器,按降序排列。 |
descendingSet() | 返回这个集合中所包含的元素的反向顺序视图。 |
floor(E e) | 返回这个集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回空。 |
headSet(E toElement) | 返回这个集合中元素严格小于toElement的部分的视图。 |
headSet(E toElement, boolean inclusive) | 返回这个集合中元素小于(或等于,如果包容性为真)toElement的部分的视图。 |
higher(E e) | 返回这个集合中严格大于给定元素的最小元素,如果没有这样的元素,则返回空。 |
iterator() | 返回这个集合中的元素的迭代器,按升序排列。 |
lower(E e) | 返回这个集合中严格小于给定元素的最大元素,如果没有这样的元素,则返回null。 |
pollFirst() | 检索并删除第一个(最低)元素,如果这个集合是空的,则返回null。 |
pollLast() | 检索并删除最后一个(最高)元素,如果这个集合是空的,则返回null。 |
subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | 返回这个集合中元素范围从fromElement到toElement的部分的视图。 |
subSet(E fromElement, E toElement) | 返回这个集合中元素范围从fromElement(包括)到toElement(不包括)的部分的视图。 |
tailSet(E fromElement) | 返回这个集合中元素大于或等于fromElement的部分的视图。 |
tailSet(E fromElement, boolean inclusive) | 返回这个集合中元素大于(或等于,如果包容性为真)fromElement的部分的视图。 |
从java.util.SortedSet接口继承的方法
方法 | 描述 |
---|---|
comparator() | 该方法返回用于对这个集合中的元素进行排序的比较器,如果这个集合使用其元素的自然排序,则返回空。 |
first() | 这个方法返回这个集合中存在的第一个(最低)元素。 |
last() | 该方法返回集合中的最后一个(最高)元素。 |
spliterator() | 在这个排序的集合中的元素上创建一个Spliterator。 |
从java.util.Set接口继承的方法
方法 | 描述 |
---|---|
add(element) | 这个方法用来添加一个特定的元素到集合中。只有当指定的元素还没有出现在集合中时,该函数才会添加该元素,否则,如果该元素已经出现在集合中,该函数会返回False。 |
addAll(collection) | 这个方法用于将所述集合中的所有元素追加到现有的集合中。这些元素是随机添加的,不遵循任何特定的顺序。 |
clear() | 这个方法用来从集合中删除所有的元素,但不是删除集合。该集合的引用仍然存在。 |
contains(element) | 这个方法用来检查一个特定的元素是否存在于集合中。 |
containsAll(collection) | 这个方法用来检查集合是否包含了存在于给定集合中的所有元素。 如果集合包含所有的元素,该方法返回true;如果有任何元素丢失,则返回false。 |
equals() | 将指定的对象与这个集合进行比较,看是否相等。 |
hashCode() | 该方法用于获取该集合实例的hashCode值。它返回一个整数值,该值是这个Set实例的hashCode值。 |
isEmpty() | 这个方法用来检查一个NavigableSet是否为空。 |
remove(element) | 这个方法用来从集合中删除给定的元素。如果指定的元素存在于集合中,该方法返回True,否则返回False。 |
removeAll(collection) | 该方法用于从集合中删除所有存在于集合中的元素。如果这个集合因调用而改变,该方法返回真。 |
retainAll(collection) | 这个方法用于保留集合中的所有元素,这些元素在给定的集合中被提及。如果这个集合在调用后发生了变化,该方法将返回true。 |
size() | 这个方法用来获取集合的大小。它返回一个整数值,表示元素的数量。 |
toArray() | 这个方法用来形成一个与集合相同元素的数组。 |
toArray(T[] a) | 返回一个包含这个集合中所有元素的数组;返回的数组的运行时类型是指定数组的类型。 |
java.util.Collection接口中声明的方法
方法 | 描述 |
---|---|
parallelStream() | 返回一个以该集合为源的可能的并行流。 |
removeIf(Predicate<? super E> filter) | 删除这个集合中满足给定谓词的所有元素。 |
stream() | 返回一个以这个集合为源的顺序流。 |
toArray(IntFunction<T[]> generator) | 返回一个包含此集合中所有元素的数组,使用提供的生成器函数来分配返回的数组。 |
java.lang.Iterable接口中声明的方法
方法 | 描述 |
---|---|
forEach(Consumer<? super T> action) | 对Iterable中的每个元素执行给定的动作,直到所有元素都被处理完,或者该动作抛出一个异常。 |