教程 > Java 教程 > Java 高级 阅读:73

Java 如何使用比较器(Comparator)

返回 Java 集合框架


TreeSet 和 TreeMap 都按排序顺序存储元素。 但是,比较器准确地定义了排序顺序的含义。

Comparator 接口定义了两个方法:compare( ) 和 equals( )。 此处显示的 compare( ) 方法比较两个元素的顺序

compare() 方法

int compare(Object obj1, Object obj2)

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

通过重写 compare(),我们可以改变对象的排序方式。 例如,要以相反的顺序排序,可以创建一个比较器来反转比较的结果。

equals() 方法

此处显示的 equals( ) 方法测试 Object 是否等于调用比较器

boolean equals(Object obj)

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

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

示例

import java.util.*;

class Dog implements Comparator<Dog>, 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;
   }

   // 重写 compareTo 方法
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }

   // 重写 compare 方法对 age 进行排序
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }
}

public class Example {

   public static void main(String args[]) {
      // 获取 Dog 对象列表
      List<Dog> list = new ArrayList<Dog>();

      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

      for(Dog a: list)   // 打印 name 的排序列表
         System.out.print(a.getDogName() + ", ");

      // 使用比较器对数组列表进行排序
      Collections.sort(list, new Dog());
      System.out.println(" ");
      
      for(Dog a: list)   // 打印 age 的排序列表
         System.out.print(a.getDogName() +"  : "+ a.getDogAge() + ", ");
   }
}

运行示例

上面代码的运行结果如下

Lacy, Roger, Shaggy, Tammy, Tommy,  
Tammy  : 1, Lacy  : 2, Shaggy  : 3, Tommy  : 4, Roger  : 10, 

返回 Java 集合框架

查看笔记

扫码一下
查看教程更方便