📅  最后修改于: 2020-04-05 12:32:36             🧑  作者: Mango
比较器接口用于对用户定义的类的对象进行排序。比较器对象能够比较两个不同类的两个对象。以下函数将obj1与obj2比较
语法:
public int compare(Object obj1, Object obj2):
假设我们有自己类型的数组/数组列表,其中包含诸如rollno,name,address,DOB等字段,我们需要根据Roll no或name对数组进行排序
方法1:一种显而易见的方法是使用一种标准算法编写我们自己的sort()函数。该解决方案需要针对不同的标准(如纸卷编号和名称)重写整个分类代码。
方法2:使用比较器接口:比较器接口用于对用户定义类的对象进行排序。此接口存在于java.util包中,包含2个方法compare(Object obj1,Object obj2)和equals(Object元素)。使用比较器,我们可以根据数据成员对元素进行排序。例如,它可能在rollno,名称,年龄或其他任何内容上。
用于对List元素进行排序的Collections类的方法用于通过给定的比较器对List的元素进行排序。
// 排序给定list, ComparatorClass必须实现
// Comparator接口
public void sort(List list, ComparatorClass c)
Collections.Sort()如何工作?
在内部,Sort方法确实调用要排序的类的Compare方法。为了比较两个元素,它询问“哪个更大?” Compare方法返回-1、0或1以表示它小于,等于或大于另一个。它使用此结果来确定是否应将其交换用于其排序。
工作程序:
// Java展示Comparator接口
import java.util.*;
import java.lang.*;
import java.io.*;
// 一个代表学生的类
class Student
{
int rollno;
String name, address;
// 构造函数
public Student(int rollno, String name,
String address)
{
this.rollno = rollno;
this.name = name;
this.address = address;
}
// 在main()当中打印学生的详情
public String toString()
{
return this.rollno + " " + this.name +
" " + this.address;
}
}
class Sortbyroll implements Comparator
{
// 对roll number进行升序排序
public int compare(Student a, Student b)
{
return a.rollno - b.rollno;
}
}
class Sortbyname implements Comparator
{
// 对roll name进行升序排序
public int compare(Student a, Student b)
{
return a.name.compareTo(b.name);
}
}
// 测试类
class Main
{
public static void main (String[] args)
{
ArrayList ar = new ArrayList();
ar.add(new Student(111, "bbbb", "london"));
ar.add(new Student(131, "aaaa", "nyc"));
ar.add(new Student(121, "cccc", "jaipur"));
System.out.println("无须");
for (int i=0; i
输出:
无须
111 bbbb london
131 aaaa nyc
121 cccc jaipur
根据rollno排序
111 bbbb london
121 cccc jaipur
131 aaaa nyc
根据name排序
131 aaaa nyc
111 bbbb london
121 cccc jaipu
通过在内部compare方法中更改返回值,您可以按所需的任何顺序排序。例如,对于降序,只需在上述比较方法中更改a和b的位置即可。
在前几篇文章中,我们讨论了如何使用Comparable和Comparator接口在单个字段的基础上对对象列表进行排序,但是,如果我们需要根据多个字段对ArrayList对象进行排序
下面是上述方法的实现:
// Java程序展示Comparator接口对多个字段进行排序
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Comparator;
class Student {
// 对象变量
String Name;
int Age;
// 参数化构造函数
public 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;
}
// 重写toString()方法
@Override
public String toString() {
return "Customer{" + "姓名=" + Name + ", 年龄=" + Age + '}';
}
static class CustomerSortingComparator implements Comparator {
@Override
public int compare(Student customer1, Student customer2) {
// 比较
int NameCompare = customer1.getName().compareTo(customer2.getName());
int AgeCompare = customer1.getAge().compareTo(customer2.getAge());
// 使用if-else块进行第二层面的比较
if (NameCompare == 0) {
return ((AgeCompare == 0) ? NameCompare : AgeCompare);
} else {
return NameCompare;
}
}
}
public static void main(String[] args) {
// 创建ArrayList来存储学生信息
List 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);
// 把当前对象加入ArrayList
al.add(obj1);
al.add(obj2);
al.add(obj3);
al.add(obj4);
al.add(obj5);
al.add(obj6);
// 在排序前
Iterator custIterator = al.iterator();
System.out.println("排序前:\n");
while (custIterator.hasNext()) {
System.out.println(custIterator.next());
}
// 使用Collections.sort(al, comparator)排序
Collections.sort(al, new CustomerSortingComparator());
// 在排序后
System.out.println("\n\n排序后:\n");
for (Student customer : al) {
System.out.println(customer);
}
}
}
输出:
排序前:
Customer{姓名=Ajay, 年龄=27}
Customer{姓名=Sneha, 年龄=23}
Customer{姓名=Simran, 年龄=37}
Customer{姓名=Ajay, 年龄=22}
Customer{姓名=Ajay, 年龄=29}
Customer{姓名=Sneha, 年龄=22}
排序后:
Customer{姓名=Ajay, 年龄=22}
Customer{姓名=Ajay, 年龄=27}
Customer{姓名=Ajay, 年龄=29}
Customer{姓名=Simran, 年龄=37}
Customer{姓名=Sneha, 年龄=22}
Customer{姓名=Sneha, 年龄=23}