Java:查找可导航集的上一个和下一个值

Java: finding previous and next value of a navigable set

我现在有一个存储整数的可导航集,我如何从特定元素中找到上一个和下一个元素?我不确定如何使用迭代器来找到这些元素。

示例:

NavigableSet<Integer> values = new TreeSet<>(List.of(1, 2, 3, 4, 5));

假设,给定 3,我想获得 2(上一个)或 4(下一个)。

更高和更低

查看官方文档:NavigableSet

有方法

  • higher : Returns 此集合中的最小元素 严格大于 给定元素,或 null 如果没有这样的元素元素.
  • lower : Returns 该集合中最大的元素 严格小于 给定元素,或者 null 如果没有这样的元素元素.

示例:

TreeSet<Integer> values = new TreeSet<>(List.of(1, 2, 4));

// 3 is not contained
int lower1 = values.lower(3); // 2
int higher1 = values.higher(3); // 4

// 2 is contained
int lower2 = values.lower(2); // 1
int higher2 = values.higher(2); // 4

天花板和地板

如果您不严格地寻找更大或更小,还有

  • ceiling:Returns这个集合中的最小元素大于或等于给定元素,或者null如果有没有这样的元素。
  • floor:Returns这个集合中最大的元素小于或等于给定元素,或者null如果有没有这样的元素。

示例:

TreeSet<Integer> values = new TreeSet<>(List.of(1, 2, 4));

// 3 is not contained
int lower1 = values.floor(3); // 2
int higher1 = values.ceiling(3); // 4

// 2 is contained
int lower2 = values.floor(2); // 2
int higher2 = values.ceiling(2); // 2

备注

如果没有这样的元素,请注意返回 null 的方法。特别是如果你自动拆箱到 int。即

int result = values.lower(1);

会因 NullPointerException 而崩溃。如果您想先检查是否存在,请坚持使用 Integer 而不是 int

还有很多方法可以做类似的事情,例如headSettailSet,您也可以在之后将其与迭代器结合使用。

在一个 NavigableSet taken 你可以使用 floor 方法来获取“上一个”元素:

Returns the greatest element in this set less than or equal to the given element, or null if there is no such element.

ceiling 获取“下一个”元素:

Returns the least element in this set greater than or equal to the given element, or null if there is no such element.

此解决方案可用于任何类型的对象。

顺便说一下,您使用的整数总是大于或小于另一个整数,如果它们不相等,您可以使用 higher or lower:

(higher) Returns the least element in this set strictly greater than the given element, or null if there is no such element.

(lower) Returns the greatest element in this set strictly less than the given element, or null if there is no such element.