Java 中的 Collection and/or 数组是否有合适的 upperBound 和 lowerBound?

Is there a proper upperBound and lowerBound for Collection and/or Arrays in Java?

阅读 this question 及其答案后,我得出结论,这两种算法没有标准实现。不过先介绍一些背景知识:

我们大多数人都熟悉 binarySearch。这个想法是,给定一个排序数组(或 Collection,如果使用来自 class 的搜索工具),它有效地(以对数形式 - O(log2 n) time) 查找给定元素在 array/collection 中的位置。我提供的特定 link 包含以下文档:

[...] If the array contains multiple elements with the specified value, there is no guarantee which one will be found.

有时,我们不关心我们是否找到(或未能找到)我们感兴趣的元素的第一次或最后一次出现。但是如果我们 do关心?

如果我们关心的话,我们会使用称为 下限 上限 的二进制搜索的变体。它们分别 return 给定元素的第一次和最后一次 1 次出现。

我来自 C++ 背景,我真的很喜欢这样一个事实,即我可以使用 std::lower_boundstd::upper_bound(以及它们用于维护顺序的容器的成员函数版本,例如 std::mapstd::set) 在容器上。

最简单的用例是,给定一个已排序的集合,确定其中有多少元素等于 xThis answer 来自我最初 linked 的问题包含以下内容:

[After performing a binarySearch] Then you continue iterating linearly until you hit to the end of the equal range.

问题是这个操作是线性的,对于随机访问的集合,我们可以做得更好——我们可以使用下限和上限,然后减去 returned 索引,我们得到结果以对数而不是线性时间表示。

从本质上讲,令我惊讶的是 Java 中可能没有实现上限和下限算法。我知道我可以自己轻松实现它们,但是,例如,如果我的数据存储在 TreeMapTreeSet 中怎么办?它们不是随机访问的,但考虑到它们的实现,上限和下限可以很容易地实现为它们的方法。

最后,我的问题是 - 在 Java 中是否有上限 and/or 下限的实现,最好在 TreeSetTreeMap 方面有效?


1但这取决于惯例。在 C++ 中,上限 return 是第一个比查找的元素 的元素。

TreeSet.floor()TreeSet.ceiling() 不是您要的吗?

或者,higher()lower(),如果您希望排除相等性。