关于compareTo方法到底是怎么比较顺序的?

a227192005 2010-12-21 11:43:19
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));
}
}
...全文
1389 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyiz 2010-12-22
  • 打赏
  • 举报
回复
如果楼主想知道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++];
}
}
sunyiz 2010-12-22
  • 打赏
  • 举报
回复
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));
}
a227192005 2010-12-22
  • 打赏
  • 举报
回复
感觉没对上我的问题,,比如“C”,“B”,“A”,三个对象排序firstName.compareTo(n.firstName)),他么具体是怎么比较的? C.compareTo(C),C.compareTo(B),C.compareTo(A),B.compareTo(C).....这样比的吗?然后得出ABC?
sunyiz 2010-12-22
  • 打赏
  • 举报
回复
你的这个例子是把当前对象的firstName这个字符串
和参数 o 中的firstName字符串
用String的compareTo方法进行比较的
String具体怎么比大小可以看看String类的源码
a227192005 2010-12-21
  • 打赏
  • 举报
回复
就拿我这个例子来说, firstName.compareTo(n.firstName)) 总的拿两个对象比较吧,具体是哪两个了?
huntor 2010-12-21
  • 打赏
  • 举报
回复
@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);
}
}
sunyiz 2010-12-21
  • 打赏
  • 举报
回复
public int compareTo(Object o) 这个方法是为了实现Comparable而存在的
而实现Comparable接口是为了可以直接用Arrays.sort()方法对你的这种对象排序

compareTo是将当前对象与参数 o 这个对象比
如果你觉得这个时候应该是当前对象大,就返回个正值
如果你觉得这个时候应该是 o 大,就返回个负值
如果你觉得这个时候应该是一样大,就返回个0

这个方法究竟怎么写,怎么返回,完全是看你觉得这个类的对象应该怎么来比大小
a227192005 2010-12-21
  • 打赏
  • 举报
回复
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又指哪一个

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧