在本教程中,我们将讨论 Java 比较器及其示例。
什么是 Java 比较器?
Java Comparator是用于比较 Java 对象的接口。 在java.util.comparator包中,Java Comparator的compare(Object 01, Object 02)方法比较两个 Java 对象。
通过使用可配置的方法,Java Comparator可以以正数、零或负数返回比较结果。 由于不限于检查数字,因此可以将 Java Comparator用于比较任何对象。 使用java.io.Serializable,可以将 Java 比较器同样用于有效地比较序列化的信息结构。
Java Comparator类似于Comparable接口,但可用于交换排序顺序,其中Comparable可通过常规顺序(如字典序)进行排序。
语法
public int compare(Object obj1, Object obj2)
如何使用 Java 比较器?
TreeSet和TreeMap 都以自然顺序存储元素。 不管怎样,比较器明确地描述了用于排序的顺序。
比较器接口具有两种技术的特征:compare()和equals()。存在compare()方法,专注于请求的两个组成部分:
compare方法
int compare(Object obj1,Object obj2)
obj1和obj2得到比较。 如果对象相等,则此方法返回零。 如果obj1比obj2更大,它将返回正数。 否则返回负数。
通过实现compare(),可以修改比较的方式。 例如,要按反向进行排序,可以使比较器反转比较结果。

equals方法
存在equals()方法,用于测试对象是否与调用比较器相符 -
boolean equals(Object obj)
obj是检查是否相等的对象。 如果obj和被调用对象都是Comparator,并且使用类似的方法,则该方法返回真。 否则,它返回false。
废除equals()是多余的,大多数直接比较器都不会这样做。
Java 比较器示例
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;}// Overriding the compareTo methodpublic int compareTo(Dog d) {return (this.name).compareTo(d.name);}// Overriding the compare method to sort the agepublic int compare(Dog d, Dog d1) {return d.age - d1.age;}}public class Example {public static void main(String args[]) {// Takes a list o Dog objectsList<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 listfor(Dog a: list) // printing the sorted list of namesSystem.out.print(a.getDogName() + ", ");// Sorts the array list using comparatorCollections.sort(list, new Dog());System.out.println(" ");for(Dog a: list) // printing the sorted list of agesSystem.out.print(a.getDogName() +" : "+ a.getDogAge() + ", ");}}
OUTPUT:
Lacy, Roger, Shaggy, Tammy, Tommy,Tammy : 1, Lacy : 2, Shaggy : 3, Tommy : 4, Roger : 10,
Java 比较器的工作示例。
import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;import java.util.List;import java.util.Comparator;class Student {// instance member variablesString Name;int Age;// parameterized constructorpublic Student(String Name, Integer Age) {this.Name = Name;this.Age = Age;}public String getName() {return Name;}public void setName(String Name) {this.Name = Name;}public Integer getAge() {return Age;}public void setAge(Integer Age) {this.Age = Age;}// overriding toString() method@Overridepublic String toString() {return "Customer{" + "Name=" + Name + ", Age=" + Age + '}';}static class CustomerSortingComparator implements Comparator<Student> {@Overridepublic int compare(Student customer1, Student customer2) {// for comparisonint NameCompare = customer1.getName().compareTo(customer2.getName());int AgeCompare = customer1.getAge().compareTo(customer2.getAge());// 2-level comparison using if-else blockif (NameCompare == 0) {return ((AgeCompare == 0) ? NameCompare : AgeCompare);} else {return NameCompare;}}}public static void main(String[] args) {// create ArrayList to store StudentList<Student> al = new ArrayList<>();// create customer objects using constructor initializationStudent obj1 = new Student("Ajay", 27);Student obj2 = new Student("Sneha", 23);Student obj3 = new Student("Simran", 37);Student obj4 = new Student("Ajay", 22);Student obj5 = new Student("Ajay", 29);Student obj6 = new Student("Sneha", 22);// add customer objects to ArrayListal.add(obj1);al.add(obj2);al.add(obj3);al.add(obj4);al.add(obj5);al.add(obj6);// before Sorting arraylist: iterate using IteratorIterator<Student> custIterator = al.iterator();System.out.println("Before Sorting:\n");while (custIterator.hasNext()) {System.out.println(custIterator.next());}// sorting using Collections.sort(al, comparator);Collections.sort(al, new CustomerSortingComparator());// after Sorting arraylist: iterate using enhanced for-loopSystem.out.println("\n\nAfter Sorting:\n");for (Student customer : al) {System.out.println(customer);}}}
输出:
Unsorted111 bbbb london131 aaaa nyc121 cccc jaipurSorted by rollno111 bbbb london121 cccc jaipur131 aaaa nycSorted by name131 aaaa nyc111 bbbb london121 cccc jaipu
