在本教程中,我们将讨论 Java 比较器及其示例。

什么是 Java 比较器?

Java Comparator是用于比较 Java 对象的接口。 在java.util.comparator包中,Java Comparatorcompare(Object 01, Object 02)方法比较两个 Java 对象。

通过使用可配置的方法,Java Comparator可以以正数、零或负数返回比较结果。 由于不限于检查数字,因此可以将 Java Comparator用于比较任何对象。 使用java.io.Serializable,可以将 Java 比较器同样用于有效地比较序列化的信息结构。

Java Comparator类似于Comparable接口,但可用于交换排序顺序,其中Comparable可通过常规顺序(如字典序)进行排序。

语法

  1. public int compare(Object obj1, Object obj2)

如何使用 Java 比较器?

TreeSetTreeMap 都以自然顺序存储元素。 不管怎样,比较器明确地描述了用于排序的顺序。

比较器接口具有两种技术的特征:compare()equals()。存在compare()方法,专注于请求的两个组成部分:

compare方法

int compare(Object obj1,Object obj2)

obj1obj2得到比较。 如果对象相等,则此方法返回零。 如果obj1obj2更大,它将返回正数。 否则返回负数。

通过实现compare(),可以修改比较的方式。 例如,要按反向进行排序,可以使比较器反转比较结果。

Java 比较器示例 - 图1

equals方法

存在equals()方法,用于测试对象是否与调用比较器相符 -

boolean equals(Object obj)

obj是检查是否相等的对象。 如果obj和被调用对象都是Comparator,并且使用类似的方法,则该方法返回真。 否则,它返回false

废除equals()是多余的,大多数直接比较器都不会这样做。

Java 比较器示例

  1. import java.util.*;
  2. class Dog implements Comparator<Dog>, Comparable<Dog> {
  3. private String name;
  4. private int age;
  5. Dog() {
  6. }
  7. Dog(String n, int a) {
  8. name = n;
  9. age = a;
  10. }
  11. public String getDogName() {
  12. return name;
  13. }
  14. public int getDogAge() {
  15. return age;
  16. }
  17. // Overriding the compareTo method
  18. public int compareTo(Dog d) {
  19. return (this.name).compareTo(d.name);
  20. }
  21. // Overriding the compare method to sort the age
  22. public int compare(Dog d, Dog d1) {
  23. return d.age - d1.age;
  24. }
  25. }
  26. public class Example {
  27. public static void main(String args[]) {
  28. // Takes a list o Dog objects
  29. List<Dog> list = new ArrayList<Dog>();
  30. list.add(new Dog("Shaggy", 3));
  31. list.add(new Dog("Lacy", 2));
  32. list.add(new Dog("Roger", 10));
  33. list.add(new Dog("Tommy", 4));
  34. list.add(new Dog("Tammy", 1));
  35. Collections.sort(list); // Sorts the array list
  36. for(Dog a: list) // printing the sorted list of names
  37. System.out.print(a.getDogName() + ", ");
  38. // Sorts the array list using comparator
  39. Collections.sort(list, new Dog());
  40. System.out.println(" ");
  41. for(Dog a: list) // printing the sorted list of ages
  42. System.out.print(a.getDogName() +" : "+ a.getDogAge() + ", ");
  43. }
  44. }
  1. OUTPUT:
  1. Lacy, Roger, Shaggy, Tammy, Tommy,
  2. Tammy : 1, Lacy : 2, Shaggy : 3, Tommy : 4, Roger : 10,

Java 比较器的工作示例。

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Comparator;
  6. class Student {
  7. // instance member variables
  8. String Name;
  9. int Age;
  10. // parameterized constructor
  11. public Student(String Name, Integer Age) {
  12. this.Name = Name;
  13. this.Age = Age;
  14. }
  15. public String getName() {
  16. return Name;
  17. }
  18. public void setName(String Name) {
  19. this.Name = Name;
  20. }
  21. public Integer getAge() {
  22. return Age;
  23. }
  24. public void setAge(Integer Age) {
  25. this.Age = Age;
  26. }
  27. // overriding toString() method
  28. @Override
  29. public String toString() {
  30. return "Customer{" + "Name=" + Name + ", Age=" + Age + '}';
  31. }
  32. static class CustomerSortingComparator implements Comparator<Student> {
  33. @Override
  34. public int compare(Student customer1, Student customer2) {
  35. // for comparison
  36. int NameCompare = customer1.getName().compareTo(customer2.getName());
  37. int AgeCompare = customer1.getAge().compareTo(customer2.getAge());
  38. // 2-level comparison using if-else block
  39. if (NameCompare == 0) {
  40. return ((AgeCompare == 0) ? NameCompare : AgeCompare);
  41. } else {
  42. return NameCompare;
  43. }
  44. }
  45. }
  46. public static void main(String[] args) {
  47. // create ArrayList to store Student
  48. List<Student> al = new ArrayList<>();
  49. // create customer objects using constructor initialization
  50. Student obj1 = new Student("Ajay", 27);
  51. Student obj2 = new Student("Sneha", 23);
  52. Student obj3 = new Student("Simran", 37);
  53. Student obj4 = new Student("Ajay", 22);
  54. Student obj5 = new Student("Ajay", 29);
  55. Student obj6 = new Student("Sneha", 22);
  56. // add customer objects to ArrayList
  57. al.add(obj1);
  58. al.add(obj2);
  59. al.add(obj3);
  60. al.add(obj4);
  61. al.add(obj5);
  62. al.add(obj6);
  63. // before Sorting arraylist: iterate using Iterator
  64. Iterator<Student> custIterator = al.iterator();
  65. System.out.println("Before Sorting:\n");
  66. while (custIterator.hasNext()) {
  67. System.out.println(custIterator.next());
  68. }
  69. // sorting using Collections.sort(al, comparator);
  70. Collections.sort(al, new CustomerSortingComparator());
  71. // after Sorting arraylist: iterate using enhanced for-loop
  72. System.out.println("\n\nAfter Sorting:\n");
  73. for (Student customer : al) {
  74. System.out.println(customer);
  75. }
  76. }
  77. }

输出

  1. Unsorted
  2. 111 bbbb london
  3. 131 aaaa nyc
  4. 121 cccc jaipur
  5. Sorted by rollno
  6. 111 bbbb london
  7. 121 cccc jaipur
  8. 131 aaaa nyc
  9. Sorted by name
  10. 131 aaaa nyc
  11. 111 bbbb london
  12. 121 cccc jaipu