Java NavigableSet

更新于 2025-12-26

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();