java如何实现comparable接口
importjava.util.*;publicclasstreeimplementsComparable{publicstaticvoidmain(String[]ar...
import java.util.*;
public class tree implements Comparable {
public static void main(String[] args) {
}
}
为何tree那里总是报错要我改为抽象类,但我要用它对treeset排序啊 展开
public class tree implements Comparable {
public static void main(String[] args) {
}
}
为何tree那里总是报错要我改为抽象类,但我要用它对treeset排序啊 展开
展开全部
我们从以下三点来解答这个问题
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;
}
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;
}
展开全部
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 的成员。
实现此接口的对象列表(和数组)可以通过 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 的成员。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你没有实现抽象方法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接口是用来比较用的。你看看我这个例子吧,不懂就追问
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你需要重写Comparable接口的compareTo方法。如下:
public int compareTo(tree t){
//代码
}
public int compareTo(tree t){
//代码
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询