import java.util.List; import java.util.ArrayList; public final class GenericBinary { public static <T extends Comparable<T>> int search (final T v, final List<T> data) { return search (v, data, 0, data.size()); } // Search everything from 'first' to 'last-1' (inclusive) public static <T extends Comparable<T>> int search (final T v, final List<T> 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<Integer> data = new ArrayList<>(); final int v = Integer.parseInt (args[0]); int n = 0; for (int i=1; i<args.length; i++) { try { data.add ( Integer.parseInt (args[i])); } catch (NumberFormatException ex) { ex.printStackTrace (System.err); } } final int i = search (v, data); if (i==-1) { System.out.printf ("%d not found%n", v); } else { System.out.printf ("%d found at index %d%n", v, i); } } }