本文转自:程序员之家论坛
原文地: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
分享到:
相关推荐
实现 Comparable 接口的类可以使用 Arrays.sort() 方法对其对象数组进行排序。 在上面的示例代码中,我们定义了一个 Simple 类,该类实现了 Comparable 接口。Simple 类具有两个属性:age 和 name。我们实现了 ...
Java 实现 Comparable 接口排序,升序、降序、倒叙 Java 中的 Comparable 接口是一个非常重要的接口,它提供了一种排序的机制,允许开发者自定义对象的排序规则。在 Java 中,实现 Comparable 接口的类可以使用 ...
java通过Comparable接口实现字符串比较大小排序的简单实例
Comparator接口与Comparable接口都是用于比较和排序自定义类的对象的大小的,但是它们有着不同的实现方式和应用场景。Comparable接口是定义在类内部的,用于比较同一个类中的对象的大小,而Comparator接口是定义在类...
这篇文章将为大家带来一个使用 Comparable 接口实现自定义排序的示例。 首先,让我们来了解一下 Comparable 接口。Comparable 接口是 Java 中的一个接口,它定义了一个compareTo 方法,该方法用于比较两个对象的...
这个教程很可能是关于如何在自定义类中实现`Comparable`接口,以便进行自然排序。`Comparable`接口位于`java.lang`包中,它只有一个方法`compareTo(T o)`,用于比较当前对象与指定对象的大小关系。 **Comparable...
在Java编程中,HashMap是Java集合框架中的一个重要成员,它提供了高效的存储和检索对象的机制。在Java 8中,HashMap有一些重要的优化...同时,理解HashMap内部如何利用Comparable接口进行排序也是优化代码性能的关键。
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行...
实现Comparable接口的类,其实例具有内在的排序关系,可以与多种泛型算法和依赖此接口的集合实现协同工作。例如,这样的对象可以直接放入有序集合,如`TreeSet`,或者用作`TreeMap`中的键,无需额外指定比较器。此外...
在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...
当我们在`TreeSet`中存储自定义类型的对象时,若想让`TreeSet`自动按照我们的需求排序,就需要让这些对象所属的类实现`Comparable`接口。具体实现方式是在类中重写`compareTo()`方法,根据业务逻辑定义比较规则。...
计算机后端-Java-Java核心基础-第22章 常用类 22. 自定义类实现Comparable自然排序.avi
首先,Comparable接口是排序接口,意味着一个类如果实现了Comparable接口,那么这个类的实例就可以进行自然排序。例如,Java中的String、Integer等内置类都实现了Comparable接口,可以方便地进行比较和排序。当你有...
首先,Comparable接口是一个排序接口,它定义了一个单一的方法`compareTo(T o)`,使得实现了Comparable接口的类的对象能够进行自然排序。这意味着如果你有一个实现了Comparable接口的对象列表(如List),你可以直接...
总的来说,Comparable和Comparator都是Java中实现排序的关键工具,它们提供了丰富的灵活性和扩展性,满足了不同场景下的排序需求。理解并掌握这两个接口,对于提升Java编程能力至关重要。在源码分析和工具开发中,...
创建名为ComparableCircle的类,它继承自Circle类,并实现Comparable接口。画出UML图并实现compareTo方法,使其根据面积比较两个圆。编写一个测试程序求出ComparableCircle对象的两个实例中的较大者。
在这个例子中,Person类实现了Comparable接口,并根据年龄进行排序。当把Person对象放入List并调用`Collections.sort(list)`时,系统会使用`compareTo()`方法进行排序。 **Comparator接口** Comparator接口位于`...
Java 中的自定义排序是指在编写 Java 程序时,通过实现 Comparable 接口来实现对对象的排序。在本节中,我们将通过一个实体类的示例来演示如何实现自定义排序。 自定义排序的必要性 在 Java 程序中,排序是非常...
当一个类实现了`Comparable`接口时,意味着它可以与同类的其他对象进行比较,并根据某种逻辑排序。例如,`Integer`和`String`类就实现了`Comparable`接口。 ##### 2. 方法详解 - `int compareTo(Object o)`: 此方法...
例如,当我们有一个自定义类的集合,并且需要按照多种方式进行排序时,可以先让类实现Comparable接口,表示其默认的排序规则,然后在需要其他排序规则时,创建Comparator实例并传递给Collections.sort()或者TreeSet...