📜  Java等价于 C++ 的 upper_bound() 方法(1)

📅  最后修改于: 2023-12-03 15:02:06.731000             🧑  作者: Mango

Java等价于 C++ 的 upper_bound() 方法

在编程中,有时需要找到某个值在有序数组或容器中的上界位置。在C++中,可以通过标准库中的upper_bound()函数实现。那么,在Java中该如何实现呢?

在Java中,我们可以使用ArraysCollections类提供的binarySearch()方法结合Collections中的binarySearch()方法来实现upper_bound()方法的功能。

public static <T> int upperBound(List<? extends Comparable<? super T>> list, T key) {
    int index = Collections.binarySearch(list, key);
    return index >= 0 ? index : -(index + 1);
}

public static <T> int upperBound(T[] arr, T key, Comparator<? super T> cmp) {
    int index = Arrays.binarySearch(arr, key, cmp);
    return index >= 0 ? index : -(index + 1);
}

以上代码实现了两个方法,一个是针对List类型的,一个是针对数组的。需要注意的是,binarySearch()返回的值可能是负数,负数的意义是表示查找的元素不在数组中,返回的值是该元素如果插入到数组中应该插入的位置(即新元素的上界位置)的相反数减一。因此,我们可以通过将-index-1来获得该元素的上界位置。

使用示例:

List<Integer> list = Arrays.asList(1, 3, 3, 5, 7, 9, 9, 11);
int idx1 = upperBound(list, 3);
int idx2 = upperBound(list, 10);
System.out.println("idx1=" + idx1); // 输出idx1=3
System.out.println("idx2=" + idx2); // 输出idx2=7

Integer[] arr = {1, 3, 3, 5, 7, 9, 9, 11};
int idx3 = upperBound(arr, 3, Comparator.naturalOrder());
int idx4 = upperBound(arr, 10, Comparator.naturalOrder());
System.out.println("idx3=" + idx3); // 输出idx3=3
System.out.println("idx4=" + idx4); // 输出idx4=8

上面的代码示例中,我们使用了两个不同的数据结构:List和数组。我们分别调用了两个upper_bound()方法,分别查找了3和10在这些数据结构中的上界位置。我们可以看到,对于存在于数据结构中的元素,返回的上界位置是正确的;而对于不存在于数据结构中的元素,返回的上界位置也是正确的。