Java - 如何使用比较器?


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

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

比较法

int compare(Object obj1, Object obj2)

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

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

等于方法

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

boolean equals(Object obj)

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

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

实施例1

在此示例中,我们使用 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 相同。

实施例2

在此示例中,我们使用 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, 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 接口以相反的顺序对 String 值进行排序。

实施例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]