Java 的 NavigableSet 接口(java.util.NavigableSet)是 Java SortedSet 接口的子类型。因此,NavigableSet 的行为与 SortedSet 相同,但额外提供了一组导航方法,用于更灵活地访问集合中的元素。本文将详细介绍 Java NavigableSet 的一些导航方法。
Java NavigableSet 的实现类
在 Java 6 到 Java 13 中,java.util 包中只有一个实现了 NavigableSet 接口的类:java.util.TreeSet。此外,在 java.util.concurrent 包中还有一个名为 ConcurrentSkipListSet 的实现类,但不在本教程讨论范围内。
创建一个 NavigableSet
要创建一个 Java NavigableSet,你需要实例化一个实现了该接口的类。以下是一个使用 TreeSet 类(它实现了 NavigableSet 接口)的示例:
NavigableSet<String> navigableSet = new TreeSet<>();
descendingSet()
descendingSet() 方法返回一个 NavigableSet 视图,其中元素的顺序与原集合相反。这个返回的“视图”由原始 NavigableSet 支持,因此对降序集合的修改也会反映到原始集合中。
示例:
NavigableSet<String> reverse = original.descendingSet();
descendingIterator()
descendingIterator() 方法允许你以逆序遍历 NavigableSet(同时也是 SortedSet)中的元素,而不会改变集合内部的元素顺序。
示例:
Iterator<String> reverse = original.descendingIterator();
headSet()
headSet() 方法返回一个原 NavigableSet 的视图,其中只包含“小于”给定元素的元素。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("2");
original.add("3");
// 此 headSet 将包含 "1" 和 "2"
SortedSet<String> headset = original.headSet("3");
// 此 headSet 将包含 "1"、"2" 和 "3",因为 inclusive = true
NavigableSet<String> headset = original.headSet("3", true);
tailSet()
tailSet() 方法与 headSet() 方法类似,但它返回所有“大于或等于”给定参数元素的元素。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("2");
original.add("3");
// 此 tailSet 将包含 "2" 和 "3"
SortedSet<String> tailSet = original.tailSet("2");
// 此 tailSet 仅包含 "3",因为 inclusive = false
NavigableSet<String> tailSet = original.tailSet("2", false);
subSet()
subSet() 方法允许你传入两个参数,用以界定返回视图集合的边界。默认情况下,第一个边界包含在内,而最后一个边界不包含在内。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("2");
original.add("3");
original.add("4");
original.add("5");
// 此 subset 将包含 "2" 和 "3"
SortedSet<String> subset = original.subSet("2", "4");
// 此 subset 将包含 "2"、"3" 和 "4",
// 因为 fromInclusive = true 且 toInclusive = true
NavigableSet<String> subset = original.subSet("2", true, "4", true);
ceiling()
ceiling() 方法返回集合中大于或等于给定参数的最小元素。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("3");
original.add("5");
// ceiling 将是 "3"
Object ceiling = original.ceiling("2");
floor()
floor() 方法与 ceiling() 相反,它返回集合中小于或等于给定参数的最大元素。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("3");
original.add("5");
// floor 将是 "1"
Object floor = original.floor("2");
higher()
higher() 方法返回集合中严格大于(不等于)给定参数的最小元素。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("2");
original.add("3");
// higher 将是 "3"
Object higher = original.higher("2");
lower()
lower() 方法与 higher() 相反,它返回集合中严格小于(不等于)给定参数的最大元素。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("2");
original.add("3");
// lower 将是 "1"
Object lower = original.lower("2");
pollFirst()
pollFirst() 方法返回并移除 NavigableSet 中的“第一个”元素(即按排序顺序最小的元素),如果集合为空则返回 null。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("2");
original.add("3");
// first 是 "1"
Object first = original.pollFirst();
pollLast()
pollLast() 方法返回并移除 NavigableSet 中的“最后一个”元素(即按排序顺序最大的元素)。
示例:
NavigableSet<String> original = new TreeSet<>();
original.add("1");
original.add("2");
original.add("3");
// last 是 "3"
Object last = original.pollLast();