比较器接口用于对用户定义类的对象进行排序。比较器对象能够比较同一类的两个对象。以下函数将 obj1 与 obj2 进行比较。
用法:
public int compare(Object obj1, Object obj2):
假设我们有一个自己的类类型的Array/ArrayList,包含卷号、名称、地址、出生日期等字段,并且我们需要根据卷号或名称对数组进行排序?
方法 1:一种明显的方法是使用一种标准算法编写我们自己的 sort() 函数。该解决方案需要针对不同的标准(例如卷号和名称)重写整个排序代码。
方法2:使用比较器接口 - Comparator 接口用于对用户定义类的对象进行排序。该接口存在于java.util包中,包含2个方法compare(Object obj1, Object obj2)和equals(Object element)。使用比较器,我们可以根据数据成员对元素进行排序。例如,它可能是卷号、姓名、年龄或其他任何内容。
Collections 类对 List 元素进行排序的方法用于通过给定的比较器对 List 的元素进行排序。
public void sort(List list, ComparatorClass c)
要对给定列表进行排序,ComparatorClass 必须实现 Comparator 接口。
Collections 类的sort() 方法如何工作?
在内部,Sort 方法确实调用它正在排序的类的 Compare 方法。为了比较两个元素,它会问“哪个更大?” Compare 方法返回 -1、0 或 1 来表示它是否小于、等于或大于另一个。然后它使用这个结果来确定是否应该交换它们的排序。
示例
Java
// Java Program to Demonstrate Working of
// Comparator Interface
// Importing required classes
import java.io.*;
import java.lang.*;
import java.util.*;
// Class 1
// A class to represent a Student
class Student {
// Attributes of a student
int rollno;
String name, address;
// Constructor
public Student(int rollno, String name, String address)
{
// This keyword refers to current instance itself
this.rollno = rollno;
this.name = name;
this.address = address;
}
// Method of Student class
// To print student details in main()
public String toString()
{
// Returning attributes of Student
return this.rollno + " " + this.name + " "
+ this.address;
}
}
// Class 2
// Helper class implementing Comparator interface
class Sortbyroll implements Comparator<Student> {
// Method
// Sorting in ascending order of roll number
public int compare(Student a, Student b)
{
return a.rollno - b.rollno;
}
}
// Class 3
// Helper class implementing Comparator interface
class Sortbyname implements Comparator<Student> {
// Method
// Sorting in ascending order of name
public int compare(Student a, Student b)
{
return a.name.compareTo(b.name);
}
}
// Class 4
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an empty ArrayList of Student type
ArrayList<Student> ar = new ArrayList<Student>();
// Adding entries in above List
// using add() method
ar.add(new Student(111, "Mayank", "london"));
ar.add(new Student(131, "Anshul", "nyc"));
ar.add(new Student(121, "Solanki", "jaipur"));
ar.add(new Student(101, "Aggarwal", "Hongkong"));
// Display message on console for better readability
System.out.println("Unsorted");
// Iterating over entries to print them
for (int i = 0; i < ar.size(); i++)
System.out.println(ar.get(i));
// Sorting student entries by roll number
Collections.sort(ar, new Sortbyroll());
// Display message on console for better readability
System.out.println("\nSorted by rollno");
// Again iterating over entries to print them
for (int i = 0; i < ar.size(); i++)
System.out.println(ar.get(i));
// Sorting student entries by name
Collections.sort(ar, new Sortbyname());
// Display message on console for better readability
System.out.println("\nSorted by name");
// // Again iterating over entries to print them
for (int i = 0; i < ar.size(); i++)
System.out.println(ar.get(i));
}
}
Unsorted 111 Mayank london 131 Anshul nyc 121 Solanki jaipur 101 Aggarwal Hongkong Sorted by rollno 101 Aggarwal Hongkong 111 Mayank london 121 Solanki jaipur 131 Anshul nyc Sorted by name 101 Aggarwal Hongkong 131 Anshul nyc 111 Mayank london 121 Solanki jaipur
通过更改比较方法内的返回值,您可以按您希望的任何顺序排序,例如: 对于降序,只需更改上述比较方法中‘a’ 和‘b’ 的位置即可。
Sort collection by more than one field
在前面的示例中,我们讨论了如何使用 Comparable 和 Comparator 接口根据单个字段对对象列表进行排序但是,如果我们需要根据多个字段对 ArrayList 对象进行排序,例如首先,根据学生姓名排序;其次,根据学生年龄排序。
示例
Java
// Java Program to Demonstrate Working of
// Comparator Interface Via More than One Field
// Importing required classes
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
// Class 1
// Helper class representing a Student
class Student {
// Attributes of student
String Name;
int Age;
// Parameterized constructor
public Student(String Name, Integer Age)
{
// This keyword refers to current instance itself
this.Name = Name;
this.Age = Age;
}
// Getter setter methods
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; }
// Method
// Overriding toString() method
@Override public String toString()
{
return "Customer{"
+ "Name=" + Name + ", Age=" + Age + '}';
}
}
// Class 2
// Helper class implementing Comparator interface
class CustomerSortingComparator
implements Comparator<Student> {
// Method 1
// To compare customers
@Override
public int compare(Student customer1, Student customer2)
{
// Comparing customers
int NameCompare = customer1.getName().compareTo(
customer2.getName());
int AgeCompare = customer1.getAge().compareTo(
customer2.getAge());
// 2nd level comparison
return (NameCompare == 0) ? AgeCompare
: NameCompare;
}
}
// Method 2
// Main driver method
class GFG {
public static void main(String[] args)
{
// Create an empty ArrayList
// to store Student
List<Student> al = new ArrayList<>();
// Create customer objects
// using constructor initialization
Student 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);
// Adding customer objects to ArrayList
// using add() method
al.add(obj1);
al.add(obj2);
al.add(obj3);
al.add(obj4);
al.add(obj5);
al.add(obj6);
// Iterating using Iterator
// before Sorting ArrayList
Iterator<Student> custIterator = al.iterator();
// Display message
System.out.println("Before Sorting:\n");
// Holds true till there is single element
// remaining in List
while (custIterator.hasNext()) {
// Iterating using next() method
System.out.println(custIterator.next());
}
// Sorting using sort method of Collections class
Collections.sort(al,
new CustomerSortingComparator());
// Display message only
System.out.println("\n\nAfter Sorting:\n");
// Iterating using enhanced for-loop
// after Sorting ArrayList
for (Student customer : al) {
System.out.println(customer);
}
}
}
Before Sorting: Customer{Name=Ajay, Age=27} Customer{Name=Sneha, Age=23} Customer{Name=Simran, Age=37} Customer{Name=Ajay, Age=22} Customer{Name=Ajay, Age=29} Customer{Name=Sneha, Age=22} After Sorting: Customer{Name=Ajay, Age=22} Customer{Name=Ajay, Age=27} Customer{Name=Ajay, Age=29} Customer{Name=Simran, Age=37} Customer{Name=Sneha, Age=22} Customer{Name=Sneha, Age=23}
相关用法
- Java Comparator comparingDouble()用法及代码示例
- Java Comparator comparingInt()用法及代码示例
- Java Comparator comparingLong()用法及代码示例
- Java Comparator naturalOrder()用法及代码示例
- Java Comparator nullsFirst()用法及代码示例
- Java Comparator nullsLast()用法及代码示例
- Java Comparator reversed()用法及代码示例
- Java Comparator reverseOrder()用法及代码示例
- Java Comparator thenComparingDouble()用法及代码示例
- Java Comparator thenComparingInt()用法及代码示例
- Java Comparator thenComparingLong()用法及代码示例
- Java Comparable Interface用法及代码示例
- Java Compiler command()用法及代码示例
- Java Compiler compileClass()用法及代码示例
- Java Compiler compileClasses()用法及代码示例
- Java Compiler disable()用法及代码示例
- Java Compiler enable()用法及代码示例
- Java CompoundName getAll()用法及代码示例
- Java CompositeName size()用法及代码示例
- Java CompoundName remove()用法及代码示例
- Java CompoundName startsWith()用法及代码示例
- Java CompoundName compareTo()用法及代码示例
- Java CompositeName isEmpty()用法及代码示例
- Java CompositeName clone()用法及代码示例
- Java CompoundName hashCode()用法及代码示例
注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Comparator Interface in Java with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。