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));
}
}
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));
}
}
Name n = (Name)o;
int lastCmp = lastName.compareTo(n.lastName);
return
(lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
}
把引用对象t传进来,强制转换成Name, lastName是当前对象具体指的是哪个,n.lastName又指哪一个
而实现Comparable接口是为了可以直接用Arrays.sort()方法对你的这种对象排序compareTo是将当前对象与参数 o 这个对象比
如果你觉得这个时候应该是当前对象大,就返回个正值
如果你觉得这个时候应该是 o 大,就返回个负值
如果你觉得这个时候应该是一样大,就返回个0这个方法究竟怎么写,怎么返回,完全是看你觉得这个类的对象应该怎么来比大小
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);
}
}
和参数 o 中的firstName字符串
用String的compareTo方法进行比较的
String具体怎么比大小可以看看String类的源码
//把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));
}
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++];
}
}