原创---关于实现comparable接口的排序例子

本文转自 程序员之家论坛  
Java 2java.lang中新增长了一个接口:Comparable。实现Comparable的类的对象能够被排序。换句话说,实现Comparable的类包含了能够按某种有意义的方式进行比较的对象。Comparable接口说明了一个方法,该方法用于肯定Java 2调用一个类的实例的天然顺序。该方法以下所示: int compareTo(Object obj) 这个方法比较调用对象和obj。若是他们相等,就返回0。若是调用对象比obj小,则返回一个负值。不然返回一个正值。特别是ByteCharacterDoubleFloatLongShortString以及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;
  }
}
从重写的compareTo方法能够看出,排序“规则”是这样的:首先按照学生姓名排序,若是学生姓名相同的话,再按照学生年龄排序。

 
写一个测试类,测试一下,代码以下:

 
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);
    }
  }
}
运行结果为:

 
name=DDD age=13

 
name=EEE age=12

 
name=FFF age=11

 
 

 
当学生姓名相同时,再按照学生的年龄排序,若是把测试类的三个例子改成:

 
      Student stu1 = new Student("EEE", 12);

 
       Student stu2 = new Student("EEE", 11);

 
       Student stu3 = new Student("DDD", 13);

 
则运行结果为:

 
   name=DDD age=13

 
name=EEE age=11

 
name=EEE age=12
相关文章
相关标签/搜索