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
。
还有很多方法可以做类似的事情,例如headSet
或tailSet
,您也可以在之后将其与迭代器结合使用。
在一个 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.
我现在有一个存储整数的可导航集,我如何从特定元素中找到上一个和下一个元素?我不确定如何使用迭代器来找到这些元素。
示例:
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
。
还有很多方法可以做类似的事情,例如headSet
或tailSet
,您也可以在之后将其与迭代器结合使用。
在一个 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.