Comparator接口类定义了用于比较两个对象的方法compare,比较器允许我们根据自定义的比较规则对对象进行排序。
int compare(T obj1, T obj2);
如果 obj1
小于 obj2
,则返回负整数
如果 obj1
等于 obj2
,则返回零
如果 obj1
大于 obj2
,则返回正整数
比较器允许我们在不修改对象自身的情况下,根据需要定义不同的排序规则。它通常用于对集合类(如 List
、Set
)中的元素进行排序
创建Integer类型的比较器
import java.util.Comparator;
public class IntegerComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return o1 -o2;
}
}
//自定义Integer类型的排序(实现Comparator接口的compare方法)
List<Integer> integers1 = Arrays.asList(6, 2, 1, 78, 65, 91, 12);
log.info("未排序={}", integers1);
IntegerComparator integerComparator = new IntegerComparator();
integers1.sort(integerComparator);
log.info("升序排序={}", integers1);
Comparator<Integer> reversed = integerComparator.reversed();//原有基础上翻转循序
integers1.sort(reversed);
log.info("降序排序={}", integers1);
//Lambda表达式方法排序
List<Integer> integers2 = Arrays.asList(6, 2, 1, 78, 65, 91, 12);
Collections.sort(integers2);//默认升序
log.info("默认升序排序={}", integers2);
Collections.sort(integers2, (o1, o2) -> o2 - o1);
log.info("Lambda表达式方法排序倒序={}", integers2);
Collections.sort(integers2, (o1, o2) -> o1 - o2);
log.info("Lambda表达式方法排序升序={}", integers2);
创建复杂对象的比较器
import java.util.Comparator;
public class WCgqComparator implements Comparator<WCgq> {
@Override
public int compare(WCgq o1, WCgq o2) {
Integer i = Integer.valueOf(o1.getId()) - Integer.valueOf(o2.getId());
if (i != 0) {
return i;
}
i = Integer.valueOf(o1.getFCgqid()) - Integer.valueOf(o2.getFCgqid());
return i;
}
}
//复杂对象排序
ArrayList<WCgq> wCgqs = new ArrayList<>();
WCgq wCgq1 = new WCgq();
wCgq1.setId("3");
wCgq1.setFCgqid("9");
wCgqs.add(wCgq1);
WCgq wCgq2 = new WCgq();
wCgq2.setId("3");
wCgq2.setFCgqid("5");
wCgqs.add(wCgq2);
WCgq wCgq3 = new WCgq();
wCgq3.setId("4");
wCgq3.setFCgqid("3");
wCgqs.add(wCgq3);
WCgq wCgq4 = new WCgq();
wCgq4.setId("1");
wCgq4.setFCgqid("9");
wCgqs.add(wCgq4);
Collections.sort(wCgqs,
Comparator.comparing(WCgq::getId).thenComparing(WCgq::getFCgqid));
log.info("Comparator排序={}", wCgqs);
log.info("未排序={}", wCgqs);
WCgqComparator wCgqComparator = new WCgqComparator();
wCgqs.sort(wCgqComparator);
log.info("自定义排序={}", wCgqs);
简单用例,希望帮助到大家