📅  最后修改于: 2023-12-03 15:02:06.731000             🧑  作者: Mango
在编程中,有时需要找到某个值在有序数组或容器中的上界位置。在C++中,可以通过标准库中的upper_bound()
函数实现。那么,在Java中该如何实现呢?
在Java中,我们可以使用Arrays
或Collections
类提供的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在这些数据结构中的上界位置。我们可以看到,对于存在于数据结构中的元素,返回的上界位置是正确的;而对于不存在于数据结构中的元素,返回的上界位置也是正确的。