Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - 如何使用 Comparator?



TreeSet 和 TreeMap 都以排序順序儲存元素。但是,正是比較器精確地定義了“排序順序”的含義。

Java Comparator 介面

在 Java 中,Comparator 介面java.util 包的一部分,它定義了使用者定義的 物件的順序。

Comparator 介面的方法

Comparator 介面定義了兩種方法:compare()equals()compare() 方法(如下所示)比較兩個元素的順序 -

compare() 方法

int compare(Object obj1, Object obj2)

obj1 和 obj2 是要比較的物件。如果物件相等,則此方法返回零。如果 obj1 大於 obj2,則返回正值。否則,返回負值。

透過覆蓋 compare(),您可以更改物件排序的方式。例如,要以相反的順序排序,您可以建立一個比較器,該比較器反轉比較的結果。

equals() 方法

equals() 方法(如下所示)測試某個物件是否等於呼叫比較器 -

boolean equals(Object obj)

obj 是要測試相等性的物件。如果 obj 和呼叫物件都是 Comparator 物件並使用相同的排序,則該方法返回 true。否則,返回 false。

覆蓋 equals() 是不必要的,大多數簡單的比較器都不會這樣做。

Comparator 介面對自定義物件進行排序

在此示例中,我們使用 Comparator 介面根據比較條件對自定義物件 Dog 進行排序。

示例

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

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;
   }

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

   // Overriding the compare method to sort the age 
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }

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

public class ComparatorDemo {

   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);

      // Sorts the array list using comparator
      Collections.sort(list, new Dog());
      System.out.println(" ");

      System.out.println("Sorted by age:");
      // printing the sorted list of ages
      System.out.print(list);
   }
}

輸出

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

注意 - Arrays 類的排序與 Collections相同。

Comparator 介面進行反向排序

在此示例中,我們使用 Comparator 介面對 Dog 物件進行反向排序。

示例 2

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

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;
   }

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

   // Overriding the compare method to sort the age 
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }

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

public class ComparatorDemo {

   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]

在此示例中,我們使用 Comparator 介面按反序對字串值進行排序。

示例 3

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

public class ComparatorDemo {

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

      list.add("Shaggy");
      list.add("Lacy");
      list.add("Roger");
      list.add("Tommy");
      list.add("Tammy");

      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, Tammy, Shaggy, Roger, Lacy]
廣告