Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误与异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 与框架

Java 类引用

Java 有用资源

Java - 如何使用Comparable接口?



Java Comparable 接口

Comparable 接口是一个非常重要的接口,可以被 Java 集合 用于比较自定义 对象 并对其进行排序。使用 Comparable 接口,我们可以像对 包装类字符串 对象使用集合排序方法一样对自定义对象进行排序。

使用 Comparable 接口,我们可以使元素可排序。

Comparable 接口方法

Comparable 接口定义了一个方法:compareTo()。compareTo() 方法如下所示,用于比较传入的对象的顺序:

compare() 方法

int compareTo(Object obj)

obj 是要比较的对象。如果对象相等,则此方法返回零。如果当前对象大于 obj,则返回正值。否则,返回负值。

通过重写 compareTo(),您可以更改对象的排序方式。例如,要以相反的顺序排序,您可以实现一个反转比较结果的比较方法。

equals() 方法

equals() 方法如下所示,测试一个对象是否等于调用比较器的对象:

boolean equals(Object obj)

obj 是要测试是否相等的对象。如果 obj 和调用对象都是 Comparator 对象并使用相同的排序顺序,则此方法返回 true。否则,返回 false。

没有必要重写 equals(),大多数简单的比较器都不会这样做。

使用 Comparable 接口对自定义对象排序

在此示例中,我们使用 Comparable 接口根据比较条件对自定义对象 Dog 进行排序。

示例

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Dog implements Comparable<Dog> {
   private String name;
   private int age;
   Dog() {
   }

   Dog(String n, int a) {
      name = n;
      age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   // Overriding the compareTo method
   public int compareTo(Dog d) {
      // compare the name using alphabetical order   
      return (this.name).compareTo(d.name);
   }

   @Override
   public String toString() {
      return this.name + "," + this.age;
   }
}

public class ComparableDemo {

   public static void main(String args[]) {
      // Takes a list o Dog objects
      List<Dog> list = new ArrayList<>();

      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));

      Collections.sort(list);   // Sorts the array list
      System.out.println("Sorted by name:");
      // printing the sorted list of names
      System.out.print(list);
   }
}

输出

这将产生以下结果:

Sorted by name:
[Lacy,2, Roger,10, Shaggy,3, Tammy,1, Tommy,4]

注意 - Arrays 类 的排序与集合的排序相同。

使用 Comparable 接口以相反的顺序对自定义对象排序

示例

在此示例中,我们使用 Collections.reverseOrder() 方法 来反向排序 Dog 对象。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Dog implements Comparable<Dog> {
   private String name;
   private int age;
   Dog() {
   }

   Dog(String n, int a) {
      name = n;
      age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   // Overriding the compareTo method
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }

   @Override
   public String toString() {
      return this.name + "," + this.age;
   }
}

public class ComparableDemo {

   public static void main(String args[]) {
      // Takes a list o Dog objects
      List<Dog> list = new ArrayList<>();

      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));

      Collections.sort(list, Collections.reverseOrder());   // Sorts the array list
      System.out.println("Sorted by name in reverse order:");
      // printing the sorted list of names
      System.out.print(list);
   }
}

输出

这将产生以下结果:

Sorted by name in reverse order:
[Tommy,4, Tammy,1, Shaggy,3, Roger,10, Lacy,2]

示例

在此示例中,我们使用 Comparable 接口根据它们的年龄对 Dog 对象进行排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Dog implements Comparable<Dog> {
   private String name;
   private int age;
   Dog() {
   }

   Dog(String n, int a) {
      name = n;
      age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   // Overriding the compareTo method
   public int compareTo(Dog d) {
      return this.age - d.age;
   }

   @Override
   public String toString() {
      return this.name + "," + this.age;
   }
}

public class ComparableDemo {

   public static void main(String args[]) {
      // Takes a list o Dog objects
      List<Dog> list = new ArrayList<>();

      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));

      Collections.sort(list);   // Sorts the array list
      System.out.println("Sorted by age:");
      // printing the sorted list by age
      System.out.print(list);
   }
}

输出

这将产生以下结果:

Sorted by age:
[Tammy,1, Lacy,2, Shaggy,3, Tommy,4, Roger,10]
广告