Java相当于Python中的一分为二
Java中是否有用于Python的bisecte模块的等效项?使用Python的一分为二,你可以用方向做数组二分切。例如:bisect.bisect_left
为列表中的项目找到正确的插入点以保持排序顺序。参数 lo 和 hi 可用于指定应考虑的列表子集;默认情况下,将使用整个列表。
我知道我也可以通过二进制搜索手动执行此操作,但我想知道是否已经有一个库或集合在这样做。
Java中是否有用于Python的bisecte模块的等效项?使用Python的一分为二,你可以用方向做数组二分切。例如:bisect.bisect_left
为列表中的项目找到正确的插入点以保持排序顺序。参数 lo 和 hi 可用于指定应考虑的列表子集;默认情况下,将使用整个列表。
我知道我也可以通过二进制搜索手动执行此操作,但我想知道是否已经有一个库或集合在这样做。
您有两种选择:
java.util.Arrays.binary
在数组上搜索java.util.Collections.binarySearch
on List
可比
和比较器
过载)。List.subList(int fromIndex, int toIndex)
合并以搜索列表的一部分到目前为止(Java 8),这仍然缺失,所以你仍然必须自己做。这是我的:
public static int bisect_right(int[] A, int x) {
return bisect_right(A, x, 0, A.length);
}
public static int bisect_right(int[] A, int x, int lo, int hi) {
int N = A.length;
if (N == 0) {
return 0;
}
if (x < A[lo]) {
return lo;
}
if (x > A[hi - 1]) {
return hi;
}
for (;;) {
if (lo + 1 == hi) {
return lo + 1;
}
int mi = (hi + lo) / 2;
if (x < A[mi]) {
hi = mi;
} else {
lo = mi;
}
}
}
public static int bisect_left(int[] A, int x) {
return bisect_left(A, x, 0, A.length);
}
public static int bisect_left(int[] A, int x, int lo, int hi) {
int N = A.length;
if (N == 0) {
return 0;
}
if (x < A[lo]) {
return lo;
}
if (x > A[hi - 1]) {
return hi;
}
for (;;) {
if (lo + 1 == hi) {
return x == A[lo] ? lo : (lo + 1);
}
int mi = (hi + lo) / 2;
if (x <= A[mi]) {
hi = mi;
} else {
lo = mi;
}
}
}
测试使用(X是我存储打算重用的静态方法的类):
@Test
public void bisect_right() {
System.out.println("bisect_rienter code hereght");
int[] A = new int[]{0, 1, 2, 2, 2, 2, 3, 3, 5, 6};
assertEquals(0, X.bisect_right(A, -1));
assertEquals(1, X.bisect_right(A, 0));
assertEquals(6, X.bisect_right(A, 2));
assertEquals(8, X.bisect_right(A, 3));
assertEquals(8, X.bisect_right(A, 4));
assertEquals(9, X.bisect_right(A, 5));
assertEquals(10, X.bisect_right(A, 6));
assertEquals(10, X.bisect_right(A, 7));
}
@Test
public void bisect_left() {
System.out.println("bisect_left");
int[] A = new int[]{0, 1, 2, 2, 2, 2, 3, 3, 5, 6};
assertEquals(0, X.bisect_left(A, -1));
assertEquals(0, X.bisect_left(A, 0));
assertEquals(2, X.bisect_left(A, 2));
assertEquals(6, X.bisect_left(A, 3));
assertEquals(8, X.bisect_left(A, 4));
assertEquals(8, X.bisect_left(A, 5));
assertEquals(9, X.bisect_left(A, 6));
assertEquals(10, X.bisect_left(A, 7));
}