Random tech excursions

upper_bound and lower_bound in Java Standard Library

Sometimes, there are simple things that fly under your radar.

C++ has upper_bound and lower_bound that return the elements that are bounds for a given element in a sorted array or collection. Python has a similar bisect module that has functions bisect_left and bisect_right.

I did not find similar functions in Java Standard Library. I would resort to following the binary search again over the collection or array to find the bounds. I discovered that the binarySearch methods from java.util.Collections and java.util.Arrays return the index of element if the element was found in the collection/array or a negative number indicating the insertion point of the element.

The insertion point is the clue here. From the Java docs, here is the description of the return value from binarySearch:

index of the search key, if it is contained in the array; otherwise, (-(insertion point) - 1). The insertion point is defined as the point at which the key would be inserted into the array: the index of the first element greater than the key, or a.length if all elements in the array are less than the specified key.

Also notice here that (-(insertion point) - 1) is actually the two’s complement of insertion point. Applying tilde operator ~ to an integer gives us its 2s complement.

 int upperBound;
 int lowerBound;
 int index = Collections.binarySearch(sortedList);
 if(index < 0) {
	 index = ~index; //Get the insertion point using 2's complement.
 }
 if(index < sortedList.size()) {
	 upperBound = sortedList.get(index);
	 lowerBound = sortedList.get(index - 1);
 }