在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

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

2017-2-7 13:38| 发布者: zhangjf| 查看: 542| 评论: 0

摘要: Java 2在java.lang中新增加了一个接口:Comparable。实现Comparable的类的对象可以被排序。换句话说,实现Comparable的类包含了可以按某种有意义的方式进行比较的对象。Comparable接口说明了一个方法,该方法用于确 ...
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( )方法。实现这个接口的对象可以被使用在不同的集合中。

西安华育国际,专注IT培训17年
要比较一个类,必须实现Comparable,并且重写compareTo方法。

现看一下该接口的定义:
[java] view plain copy


  • public interface Comparable{   
  •             public int compareTo(Object o);   
  • }   


要自己实现该接口,从API看到该接口只有一个方法,

compareTo的约定是:

将当前这个对象与指定的对象进行顺序比较,当该对象小于、等于或大于指定对象时,分别返回一个负整数、0或正整数,如果无法进行比较,则抛出ClassCastException异常。(泛型没有掌握,所以compareTo的参数用Object ,所以比较之前必须进行强制转换。如果学会了泛型就方便多了)。

   现在我们写个例子来实践一下,重写comparable接口的compareTo的方法,按照我们所定义的“规则”排序。

   Student类实现了Comparable接口并重写了compareTo的方法,代码如下:

java代码

[java] view plain copy


  • 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方法可以看出,排序“规则”是这样的:首先按照学生姓名排序,如果学生姓名相同的话,再按照学生年龄排序。

写一个测试类,测试一下,代码如下:
[java] view plain copy


  • 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







最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 21:41

Copyright 2015-2025 djqfx

返回顶部