import java.util.*;public class Test {
public static void main(String args[]) {
List t = new LinkedList();
t.add(new Name("Karl", "M"));
t.add(new Name("John", "O"));
t.add(new Name("Tom", "M"));
System.out.println(t);
Collections.sort(t);
System.out.println(t);
}
}class Name implements Comparable{
String firstName, lastName;
Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

public String toString() {
return firstName + " " + lastName;
}

public int compareTo(Object o) {
Name n = (Name)o;
int lastCmp = lastName.compareTo(n.lastName);
return
(lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
}
}

解决方案 »

  1.   

    public int compareTo(Object o) {
    Name n = (Name)o;
    int lastCmp = lastName.compareTo(n.lastName);
    return
    (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName)); 

    把引用对象t传进来,强制转换成Name, lastName是当前对象具体指的是哪个,n.lastName又指哪一个
      

  2.   

    public int compareTo(Object o) 这个方法是为了实现Comparable而存在的
    而实现Comparable接口是为了可以直接用Arrays.sort()方法对你的这种对象排序compareTo是将当前对象与参数 o 这个对象比
    如果你觉得这个时候应该是当前对象大,就返回个正值
    如果你觉得这个时候应该是 o 大,就返回个负值
    如果你觉得这个时候应该是一样大,就返回个0这个方法究竟怎么写,怎么返回,完全是看你觉得这个类的对象应该怎么来比大小
      

  3.   

    @Override public int compareTo(Object o){
        if (o == this) return true;
        if (o == null) return false;
        if (getClass() != o.getClass()) return false;
        Name that = (Name)o;
        int lc = lastName.compareTo(that.lastName);
        if(lc != 0){
    return lc;
        }
        else{
    return firstName.compareTo(that.firstName);
        }
    }
      

  4.   

    就拿我这个例子来说, firstName.compareTo(n.firstName)) 总的拿两个对象比较吧,具体是哪两个了?
      

  5.   

    你的这个例子是把当前对象的firstName这个字符串
    和参数 o 中的firstName字符串
    用String的compareTo方法进行比较的
    String具体怎么比大小可以看看String类的源码
      

  6.   

    感觉没对上我的问题,,比如“C”,“B”,“A”,三个对象排序firstName.compareTo(n.firstName)),他么具体是怎么比较的? C.compareTo(C),C.compareTo(B),C.compareTo(A),B.compareTo(C).....这样比的吗?然后得出ABC?
      

  7.   

    public int compareTo(Object o) {
    //把Object o转成Name型,便于比较
    Name n = (Name)o;
    //我们Name怎么比大小呢?那就直接比比我们的lastName吧,
    //怎么比,直接用String的compareTo方法好了,java写好的,不用白不用
    int lastCmp = lastName.compareTo(n.lastName);
    //看看吧如果lastName比出结果了,那最好罗,如果比出来一样咋办?那我们再比比firstName吧
    return
    (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));  
    }  
      

  8.   

    如果楼主想知道java中
    Arrays.sort()是怎么通过compareTo比大小的
    那看看Arrays中的相关方法吧,下面贴一段里面的代码
        private static void mergeSort(Object[] src,
      Object[] dest,
      int low,
      int high,
      int off) {
    int length = high - low; // Insertion sort on smallest arrays
            if (length < INSERTIONSORT_THRESHOLD) {
                for (int i=low; i<high; i++)
                    for (int j=i; j>low &&
     ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                        swap(dest, j, j-1);
                return;
            }        // Recursively sort halves of dest into src
            int destLow  = low;
            int destHigh = high;
            low  += off;
            high += off;
            int mid = (low + high) >>> 1;
            mergeSort(dest, src, low, mid, -off);
            mergeSort(dest, src, mid, high, -off);        // If list is already sorted, just copy from src to dest.  This is an
            // optimization that results in faster sorts for nearly ordered lists.
            if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
                System.arraycopy(src, low, dest, destLow, length);
                return;
            }        // Merge sorted halves (now in src) into dest
            for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
                if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
                    dest[i] = src[p++];
                else
                    dest[i] = src[q++];
            }
        }