import java.util.*;
class A implements  Comparable
{
int i,j;
public A(int a1,int a2)
{
i=a1;
j=a2;
}
public int compareTo(Object obj)
{
int k=((A)obj).i;
if(k>i)
return -1;
else if(k==i)
return 0;
else
return 1;
}
public String toString()
{
return "("+i+","+j+")";
}
}
public class M
{

public static void main(String[] args)
{
A[] a={new A(5,2),new A(2,3),new A(3,1)};
Arrays.sort(a);

System.out.println(Arrays.toString(a));
int loc;
A obj1=new A(2,3);
loc=Arrays.binarySearch(a,obj1);
System.out.print(loc);

}
}上面是用来查找数组中是否存在一个对象的。
为什么A(3,1) A(3,2)都会显示 loc>0呢   按书上说应该是后者loc<0那要怎么样才能在数组中查找一个A对象是否存在呢

解决方案 »

  1.   

    Arrays.binarySearch做比较的时候会自动调用对象的int compareTo(Object obj) 方法,也就是说比较两个对象是不是相同是根据int compareTo(Object obj) 的返回值判断,你重写后的compareTo就是比较成员函数i是否相等。
      

  2.   

    楼上正解,源码如下
     public static int binarySearch(Object[] a, int fromIndex, int toIndex,
       Object key) {
    rangeCheck(a.length, fromIndex, toIndex);
    return binarySearch0(a, fromIndex, toIndex, key);
        }    // Like public version, but without range checks.
        private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
         Object key) {
    int low = fromIndex;
    int high = toIndex - 1; while (low <= high) {
        int mid = (low + high) >>> 1;
        Comparable midVal = (Comparable)a[mid];
        int cmp = midVal.compareTo(key);     if (cmp < 0)
    low = mid + 1;
        else if (cmp > 0)
    high = mid - 1;
        else
    return mid; // key found
    }
    return -(low + 1);  // key not found.
        }