关于实现Comparable接口

chenhonghong 2008-04-27 02:18:05
以下类是实现一个comparable接口 进行排序 然后打印 但里面的compareTo方法运作原理我不懂,还有int rvi=((tct)o).i;这个表达式理解不了! 请高手指教
import java.util.*;
public class tct implements Comparable{
int i,j;
public tct(int c,int d){
i=c;
j=d;
}
public int compareTo(Object o) {
int rvi=((tct)o).i;
return (i<rvi?-1:(i==rvi?0:1));
}
public String toString(){
return "(i)"+i+"(j)"+j+" ";
}

public static void main(String[] args) {
tct[] f=new tct[10];
Random r=new Random();
for(int b=0;b<f.length;b++)
{
f[b]=new tct(r.nextInt(100),r.nextInt(100));
}
Arrays.sort(f);
for(int e=0;e<f.length;e++)
{
System.out.print(f[e]);
}
}
}
...全文
610 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独剑客 2008-10-31
  • 打赏
  • 举报
回复
如果对象之间比较大小是话 是不是都得实现这个接口??
孤独剑客 2008-10-31
  • 打赏
  • 举报
回复
如果对象之间比较大小是话 是不是都得实现这个接口??
virusswb 2008-04-27
  • 打赏
  • 举报
回复
int rvi=((tct)o).i; 这个接口就是要实现里面的方法,实现这个接口才可以使用数组提供的sort排序
这个实现就是比较两个tct的i值
o是object的,所以要先强制转化成tct类型
然后取出来i赋值给rvi

Shine_Panda 2008-04-27
  • 打赏
  • 举报
回复
参看下面这个例子:


import java.util.Comparator;
import java.util.ArrayList;



public class Demo{
public static void main(String[] args){


User u1 =new User("aaa",12);
User u2 =new User("ddd",10);
User u3 =new User("ccc",20);
User u4 =new User("bbb",10);

ArrayList arrayList = new ArrayList();
arrayList.add(u1);
arrayList.add(u2);
arrayList.add(u3);
arrayList.add(u4);

Object[] users =arrayList.toArray();
System.out.println ("排序前。。。。");
for (int i = 0; i<users.length; i++){
System.out.println (users[i]);
}
System.out.println ("*******************************");
System.out.println ("排序后。。。。。");
//把排序规则交给sort方法。该方法就回按照你自定义的规则进行排序

java.util.Arrays.sort(users,new MyComparator());


for (int i = 0; i<users.length; i++){
System.out.println (users[i]);
}



}
}

class User{
String name;
int age ;

public User(String name,int age){
this.name = name;
this.age = age;
}

public String toString(){
return name+":::"+age;
}

}


class MyComparator implements Comparator{
public int compare(Object obj1, Object obj2 ){
User u1 = (User)obj1;
User u2 = (User)obj2;
if(u1.age>u2.age){
return 1;
}else if(u1.age<u2.age){
return -1;
}else{
//利用String自身的排序方法。
//如果年龄相同就按名字进行排序
return u1.name.compareTo(u2.name);
}


}
}




anqini 2008-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Steve_Samuelson 的回复:]
1.为什么要实现compareTo方法?
Arrays类的sort方法默认是根据元素的自然顺序对指定对象数组按升序进行排序。
类的 compareTo 方法被称为它的自然比较方法。因此必须实现Comparable接口的compareTo方法才能进行sort
否则会出现ClassCastException异常
2.关于int rvi=((tct)o).i的解释
因为int compareTo(T o)中使用了泛型,T可以表示任意类的实现对象。这里你将参数类型设置为了Object,
因此要转化为txt类型的对象,…
[/Quote]
我是风 2008-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sigmod 的回复:]
int rvi=((tct)o).i; 把o转成tct了类型(传进来的参数是Object类型),访问属性i
[/Quote]
Steve_Samuelson 2008-04-27
  • 打赏
  • 举报
回复
1.为什么要实现compareTo方法?
Arrays类的sort方法默认是根据元素的自然顺序对指定对象数组按升序进行排序。
类的 compareTo 方法被称为它的自然比较方法。因此必须实现Comparable接口的compareTo方法才能进行sort
否则会出现ClassCastException异常
2.关于int rvi=((tct)o).i的解释
因为int compareTo(T o)中使用了泛型,T可以表示任意类的实现对象。这里你将参数类型设置为了Object,
因此要转化为txt类型的对象,才能取到子类中的成员变量。理解了多态这个地方自然可以理解。
limon758 2008-04-27
  • 打赏
  • 举报
回复
int rvi=((tct)o).i;
转换为类类型

public int compareTo(Object o) {
int rvi=((tct)o).i;
return (i <rvi?-1:(i==rvi?0:1));
}

如果 int rvi=((tct)o).i;
改为int rvi=o.i; 你就懂了吧
那么加上((tct)o).i;就是把o这个对象转换为tct类型了

HttpSession session = request.getSession();
session.setAttribute("i",i);
String i = (String)session.getAttribute("i");
awusoft 2008-04-27
  • 打赏
  • 举报
回复


int rvi=((tct)o).i

====

tct temp = (tct)o;
int rvi=temp.i;
chenhonghong 2008-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sigmod 的回复:]
int rvi=((tct)o).i; 把o转成tct了类型(传进来的参数是Object类型),访问属性i
[/Quote]

但是从哪里传进来啊?好像没有哪里显示出来有调用此方法啊?
public int compareTo(Object o) {
int rvi=((tct)o).i;
return (i <rvi?-1:(i==rvi?0:1));
}
fuyou001 2008-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sigmod 的回复:]
int rvi=((tct)o).i; 把o转成tct了类型(传进来的参数是Object类型),访问属性i
[/Quote]
sigmod 2008-04-27
  • 打赏
  • 举报
回复
针对接口编程啊,你实现了,Comparable,在用其他类的时候,比如Collections.sort(list),假设list里面都是tct对象,这时候在sort里面,他们都被转成Comparable类型,就可以排序了,比大小时根据你实现的comparTo方法来决定两个tct对象的大小

int rvi=((tct)o).i; 把o转成tct了类型(传进来的参数是Object类型),访问属性i

62,623

社区成员

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

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