本文转自:程序员之家论坛
原文地:http://www.phome.asia/forum/thread/20600.htm
Java 2在java.lang中新增加了一个接口:Comparable。实现Comparable的类的对象可以被排序。换句话说,实现Comparable的类包含了可以按某种有意义的方式进行比较的对象。Comparable接口说明了一个方法,该方法用于确定Java 2调用一个类的实例的自然顺序。该方法如下所示: int compareTo(Object obj) 这个方法比较调用对象和obj。如果他们相等,就返回0。如果调用对象比obj小,则返回一个负值。否则返回一个正值。特别是Byte,Character,Double,Float,Long,Short,String以及Integer类定义了compareTo( )方法。实现这个接口的对象可以被使用在不同的集合中。
要比较一个类,必须实现Comparable,并且重写compareTo方法。
现看一下该接口的定义:
public interface Comparable{
public int compareTo(Object o);
}
要自己实现该接口,从API看到该接口只有一个方法,
compareTo的约定是:
将当前这个对象与指定的对象进行顺序比较,当该对象小于、等于或大于指定对象时,分别返回一个负整数、0或正整数,如果无法进行比较,则抛出ClassCastException异常。(泛型没有掌握,所以compareTo的参数用Object ,所以比较之前必须进行强制转换。如果学会了泛型就方便多了)。
现在我们写个例子来实践一下,重写comparable接口的compareTo的方法,按照我们所定义的“规则”排序。
Student类实现了Comparable接口并重写了compareTo的方法,代码如下:
Java代码
public class Student implements Comparable {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
boolean rusult = false;
if (this == obj) {
rusult = true;
}
if (!(obj instanceof Student)) {
rusult = false;
}
Student stu = (Student) obj;
if ((stu.getName().equals(this.name)) && (stu.getAge() == this.age)) {
rusult = true;
} else {
rusult = false;
}
return rusult;
}
public int hashCode() {
return (this.name.hashCode() + this.age) * 31;
}
public String toString() {
return "name=" + this.name + " age=" + this.age;
}
public int compareTo(Object o) {
Student stu = (Student) o;
if (this.getName().compareTo(stu.getName()) > 0) {
return 1;
}
if (this.getName().compareTo(stu.getName()) < 0) {
return -1;
}
if ( this.age > stu.getAge() ) {
return 1;
}
if (this.age < stu.getAge()) {
return -1;
}
return 0;
}
}
Java代码
import java.util.*;
public class TreeSetTest {
public static void main(String args[]) {
Set set = new TreeSet();
Student stu1 = new Student("EEE", 12);
Student stu2 = new Student("FFF", 11);
Student stu3 = new Student("DDD", 13);
set.add(stu1);
set.add(stu2);
set.add(stu3);
Iterator it = set.iterator();
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}