import java.util.List; import java.util.ArrayList; public final class GenericBinary { public static > int search (final T v, final List data) { return search (v, data, 0, data.size()); } // Search everything from 'first' to 'last-1' (inclusive) public static > int search (final T v, final List data, final int first, final int last) { assert 0<=first && first<=data.size(); assert 0<=last && last<=data.size(); int low = first, high = last-1; while (low <= high) { final int mid = (low+high)>>>1; // works even when + overflows if (data.get(mid).compareTo(v) == 0) { return mid; // EXIT; v found } else if (data.get(mid).compareTo(v) < 0) { System.out.printf ("data[%d]=%d is too low%n", mid, data.get(mid)); low = mid+1; } else { assert data.get(mid).compareTo(v) > 0; System.out.printf ("data[%d]=%d is too high%n", mid, data.get(mid)); high = mid-1; } } return -1; // v not found [TODO: (-(insertion point) - 1)?] } public static void main (final String [] args) { final List data = new ArrayList<>(); final int v = Integer.parseInt (args[0]); int n = 0; for (int i=1; i