本文转自:程序员之家论坛
原文地: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;
}
}
从重写的compareTo方法可以看出,排序“规则”是这样的:首先按照学生姓名排序,如果学生姓名相同的话,再按照学生年龄排序。
写一个测试类,测试一下,代码如下:
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);
}
}
}
运行结果为:
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
分享到:
相关推荐
主要介绍了java 实现Comparable接口排序,升序、降序、倒叙,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java通过Comparable接口实现字符串比较大小排序的简单实例
通过简单的例子初步了解Comparable和Comparator的使用,注释很详细
下面小编就为大家带来一篇java中实现Comparable接口实现自定义排序的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行...
comparator接口与Comparable接口的区别
492.490.JAVA基础教程_常用类-自定义类实现Comparable自然排序(492).rar
计算机后端-Java-Java核心基础-第22章 常用类 22. 自定义类实现Comparable自然排序.avi
java排序Comparator和Comparable
Comparable是 排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 此外,实现此接口的对象可以用作...
【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip
Comparable和Comparator接口都可用作普通意义上对象间的比大小,但两个接口在实例化方面的用法不尽相同,接下来我们就来详细对比Java中的Comparable排序接口和Comparator比较器接口
Java8HashMap键与Comparable接口编程开发技术共3页.pdf.zip
总结一下: ArrayList:如果是查改多,用...一般是默认排序用自然排序(Comparable接口),特殊排序用定制排序(Comparetor接口实现) LinkedHashSet:如果需要元素不重复,并且,有存入和取出顺序要求用LinkedHashSet
当且仅当要使用的对象实现Comparable接口时,我们也可以创建不带Comparator对象的SortedList。 用法 我们将像创建Java中的任何ArrayList一样创建SortedList: SortedList sortedlist = new SortedList(comparator); ...
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧
Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和ScoreDocComparator接口.在...
计算机后端-Java-Java核心基础-第22章 常用类 21. Comparable自然排序举例.avi
接口回调 用哥德巴赫猜想来总结,哥德巴赫猜想就是要去输入一个偶数,输出这个偶数能被分解为哪两个质数的和,具体实现...接口起到了两个作用,一是隔离,使用者和实现者中间有了接口来作为隔离,不必串行完成,可以并