UNB/ CS/ David Bremner/ teaching/ cs1083/ java/ BinarySearchList.java
import java.util.Collections;

public class BinarySearchList<T extends Comparable<T>> extends SearchList<T>  {

    private boolean isSorted;
    public BinarySearchList() {
        super();
        isSorted = true;
    }

    @Override
    public boolean add(T obj) {
        isSorted = false;
        return super.add(obj);
    }

    public int positionOf(T target) {
        if (!isSorted) {
            Collections.sort(this);
            isSorted = true;
        }

        int left=0;
        int right=this.size()-1;

        while (left<=right){
            int mid=(left+right)/2;
            int diff = get(mid).compareTo(target);

            if (diff==0)
                return mid;
            if (diff<0)
                left=mid+1; // search right half
            else
                right=mid-1; // search left half
        }
        return -1;
    }

    public static void main(String[] args)    {
        SearchList<String> staff = new BinarySearchList<String>();
        staff.add("Tom");
        staff.add("Dick");
        staff.add("Juliet");
        staff.add("Romeo");
        staff.add("Harry");

        System.out.println("Initial list:");
        for (String name : staff) {
            System.out.println(name);
        }

        String[] queries = {"Harry", "Tom", "Moe", "Curly"};

        for (String name : queries) {
            int pos = staff.positionOf(name);
            if (pos <0 )
                System.out.println(name + " not found");
            else
                System.out.println(name+" found @ "+pos);
        }
   }

}