【发布时间】:2023-03-10 11:31:01
【问题描述】:
我现在有一个存储整数的可导航集,我如何从特定元素中找到上一个和下一个元素?如果可以找到这些元素,我不确定如何使用迭代器。
例子:
NavigableSet<Integer> values = new TreeSet<>(List.of(1, 2, 3, 4, 5));
假设给定3,我想获得2(上一个)或4(下一个)。
【问题讨论】:
我现在有一个存储整数的可导航集,我如何从特定元素中找到上一个和下一个元素?如果可以找到这些元素,我不确定如何使用迭代器。
例子:
NavigableSet<Integer> values = new TreeSet<>(List.of(1, 2, 3, 4, 5));
假设给定3,我想获得2(上一个)或4(下一个)。
【问题讨论】:
查看官方文档:NavigableSet
有方法
higher :返回此集合中严格大于给定元素的最小元素,如果没有这样的元素,则返回 null。lower :返回此集合中严格小于给定元素的最大元素,如果没有这样的元素,则返回 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:返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回null。floor:返回这个集合中的最大元素小于或等于给定元素,如果没有这样的元素,则返回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 采取你可以使用floor 方法来获取“上一个”元素:
返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回 null。
和ceiling 获取“下一个”元素:
返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回 null。
此解决方案可用于任何类型的对象。
顺便说一句,您使用的整数总是大于或小于另一个整数,如果它们不等于,您可以使用higher 或lower:
(higher) 返回此集合中严格大于给定元素的最小元素,如果没有这样的元素,则返回 null。
(lower) 返回此集合中严格小于给定元素的最大元素,如果没有这样的元素,则返回 null。
【讨论】: