java如何实现comparable接口

importjava.util.*;publicclasstreeimplementsComparable{publicstaticvoidmain(String[]ar... import java.util.*;
public class tree implements Comparable {
public static void main(String[] args) {

}

}
为何tree那里总是报错要我改为抽象类,但我要用它对treeset排序啊
展开
 我来答
samismiling
2015-06-08 · 知道合伙人软件行家
samismiling
知道合伙人软件行家
采纳数:1340 获赞数:5604

向TA提问 私信TA
展开全部
我们从以下三点来解答这个问题

1.什么是Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。

2.实现什么方法
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”
参数:
o - 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:
ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。

3.实例
import java.util.*;

public class EmployeeSortTest {

public static void main(String[] args) {
Employee[] staff = new Employee[3];
staff[0] = new Employee("harry Hacker", 35000);
staff[1] = new Employee("carl cracke", 75000);
staff[2] = new Employee("tony Tester", 38000);
Arrays.sort(staff); // sort方法可以实现对对象数组排序,但是必须实现 Comparable接口

for (Employee e : staff)
System.out.println("id=" + e.getId() + " name=" + e.getName() + ".salary=" + e.getSalary());
}
}

class Employee implements Comparable<Employee> {
public Employee(String n, double s) {
name = n;
salary = s;
Random ID = new Random();
id = ID.nextInt(10000000);
}

public int getId() {
return id;
}

public String getName() {
return name;
}

public double getSalary() {
return salary;
}

public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}

public int compareTo(Employee other) {
if (id < other.id) // 这里比较的是什么 sort方法实现的就是按照此比较的东西从小到大排列
return -1;
if (id > other.id)
return 1;
return 0;
}

private int id;
private String name;
private double salary;
}
李青江521
2013-11-29
知道答主
回答量:41
采纳率:0%
帮助的人:17.4万
展开全部
public interface Comparable<T>此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。

对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与 e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也会抛出 NullPointerException。

强烈推荐(虽然不是必需的)使自然排序与 equals 一致。这是因为在使用其自然排序与 equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。

例如,如果将两个键 a 和 b 添加到一个没有使用显式比较器的有序集合中,使得 (!a.equals((Object)b) && a.compareTo((Object)b) == 0),则第二个 add 操作返回 false(有序集合的大小没有增加),因为从有序集合的角度来看,a 和 b 是等效的。

实际上,所有执行比较的 Java 核心类都具有 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序把值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)等同起来。

为了向数学上倾斜,在给定 C 类的基础上定义自然排序的关系 如下:

{(x, y) such that x.compareTo((Object)y) <= 0}。
整体排序的 quotient 是:
{(x, y) such that x.compareTo((Object)y) == 0}。
它直接遵循 compareTo 的协定,商是 C 的等价关系,自然排序是 C的整体排序。当我们说类的自然排序与 equals 一致 时,是指自然排序的商是由类的 equals(Object) 方法定义的等价关系。
{(x, y) such that x.equals((Object)y)}。
此接口是 Java Collections Framework 的成员。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Stale331x
2013-11-29 · TA获得超过1299个赞
知道小有建树答主
回答量:1276
采纳率:33%
帮助的人:837万
展开全部
因为你没有实现抽象方法public int compareTo(Object obj){}
追问
treeset也需要实现equal和hashCode()方法吗
追答

我弄个例子给你吧,稍等下



import java.util.*;

public class Student implements Comparable{
private double mark;
private String name;

public Student(String name,double mark){
this.name=name;
this.mark=mark;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
if(!(o instanceof Student)) return 1;
Student tmp=(Student)o;
if(this.getMark()>tmp.getMark()) return 1;
if(this.getMark()<tmp.getMark()) return -1;
return 0;
}
public double getMark() {
return mark;
}
public void setMark(double mark) {
this.mark = mark;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public static void main(String args[]){
List<Student> list=new ArrayList<Student>();
for(int i=0;i<10;i++){
list.add(new Student("S_NAME_"+i,Math.random()*100));
}
for(Student s:list){
System.out.print(s.getName()+"-"+s.getMark()+"\t");
}
System.out.println();
Collections.sort(list);
for(Student s:list){
System.out.print(s.getName()+"-"+s.getMark()+"\t");
}
}
}

comparable接口是用来比较用的。你看看我这个例子吧,不懂就追问

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1234雅雅雅
2018-02-11
知道答主
回答量:1
采纳率:0%
帮助的人:907
展开全部
你需要重写Comparable接口的compareTo方法。如下:
public int compareTo(tree t){
//代码
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式