Commit 67b66215 by aquilescanta Committed by Oliver Woodman

Add binarySearchCeil method for integers

This matches the binarySearchFloor method overload.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=221617114
parent b7710914
......@@ -638,7 +638,7 @@ public final class Util {
if (index < 0) {
index = -(index + 2);
} else {
while ((--index) >= 0 && array[index] == value) {}
while (--index >= 0 && array[index] == value) {}
if (inclusive) {
index++;
}
......@@ -670,7 +670,7 @@ public final class Util {
if (index < 0) {
index = -(index + 2);
} else {
while ((--index) >= 0 && array[index] == value) {}
while (--index >= 0 && array[index] == value) {}
if (inclusive) {
index++;
}
......@@ -706,7 +706,7 @@ public final class Util {
if (index < 0) {
index = -(index + 2);
} else {
while ((--index) >= 0 && list.get(index).compareTo(value) == 0) {}
while (--index >= 0 && list.get(index).compareTo(value) == 0) {}
if (inclusive) {
index++;
}
......@@ -734,12 +734,45 @@ public final class Util {
* equal to) {@code value}.
*/
public static int binarySearchCeil(
int[] array, int value, boolean inclusive, boolean stayInBounds) {
int index = Arrays.binarySearch(array, value);
if (index < 0) {
index = ~index;
} else {
while (++index < array.length && array[index] == value) {}
if (inclusive) {
index--;
}
}
return stayInBounds ? Math.min(array.length - 1, index) : index;
}
/**
* Returns the index of the smallest element in {@code array} that is greater than (or optionally
* equal to) a specified {@code value}.
*
* <p>The search is performed using a binary search algorithm, so the array must be sorted. If the
* array contains multiple elements equal to {@code value} and {@code inclusive} is true, the
* index of the last one will be returned.
*
* @param array The array to search.
* @param value The value being searched for.
* @param inclusive If the value is present in the array, whether to return the corresponding
* index. If false then the returned index corresponds to the smallest element strictly
* greater than the value.
* @param stayInBounds If true, then {@code (a.length - 1)} will be returned in the case that the
* value is greater than the largest element in the array. If false then {@code a.length} will
* be returned.
* @return The index of the smallest element in {@code array} that is greater than (or optionally
* equal to) {@code value}.
*/
public static int binarySearchCeil(
long[] array, long value, boolean inclusive, boolean stayInBounds) {
int index = Arrays.binarySearch(array, value);
if (index < 0) {
index = ~index;
} else {
while ((++index) < array.length && array[index] == value) {}
while (++index < array.length && array[index] == value) {}
if (inclusive) {
index--;
}
......@@ -777,7 +810,7 @@ public final class Util {
index = ~index;
} else {
int listSize = list.size();
while ((++index) < listSize && list.get(index).compareTo(value) == 0) {}
while (++index < listSize && list.get(index).compareTo(value) == 0) {}
if (inclusive) {
index--;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment