一、Comparator比较器
另个对象之间比较大小,Java中提供了两种比较实现方式,
java.lang.Comparable
接口实现,要求在被比较的对象类中实现这个接口,实现public int compareTo(对象类型 对象)
这个抽象方法。-
java.util.Comparator
接口,在做排序的时候去定制实现排序规则,实现public int compare(对象类型 o1, 对象类型 o2)
这个抽象方法。-
两个对象比较的结果有三种:大于,等于,小于。如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数) 如果要按照,降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)
-
ArrayList list = new ArrayList<>();
list.add(\"abcd\");
list.add(\"bcde\");
list.add(\"cdef\");
list.add(\"defg\");
list.add(\"efgh\");
Collections.sort(list, (a, b) -> b.charAt(0) - a.charAt(0));
/**等价于
Collections.sort(list, new Comparator() {
@Override
public int compare(String o1, String o2) {
return o2.charAt(0) - o2.charAt(1);
}
});*/
System.out.println(list);
二、Comparable 和 Comparator两个接口的区别
1. 实现Comparable接口: 类的自然排序:
-
- 强行对实现它的每个类的对象进行整体排序(在类中实现Comparable接口,重写compareTo方法)
-
- compareTo方法为自然比较方法,在类中只能实现一次,不能经常修改类的代码实现自己想要的排序。
-
- 适合固定的比较方式。
-
- 实现此接口的对象列表(和数组)可以通过
Collections.sort
、Arrays.sort不好用!
,(只有一个参数)进行自动排序要想使用这两个方法,必须得实现Comparable接口,否则报错
- 实现此接口的对象列表(和数组)可以通过
-
- 对象可以用作映射中的键或者有序集合中的元素,不需要指定比较器,直接使用!
import java.util.ArrayList;
import java.util.Collections;
public class Student02 implements Comparable{
private String name;
private int age;
public Student02(String name, int age) { this.name = name;this.age = age; }
public Student02() { }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override
public int compareTo(Student02 o) {
// 按照年龄升序排列,如果年龄一样就按照姓名字典序升序排序
int result = this.getAge() - o.getAge();
if(result == 0) {
result = this.name.compareTo(o.getName());
}
return result;
}
@Override
public String toString() {
return \"Student{\" +\"name=\'\" + name + \'\\\'\' +\", age=\" + age + \'}\';
}
public static void main(String[] args) {
ArrayList students = new ArrayList<>();
students.add(new Student02(\"a\", 20));
students.add(new Student02(\"c\", 18));
students.add(new Student02(\"a\", 18));
students.add(new Student02(\"a\", 16));
Collections.sort(students);
for (Student02 student : students) {
System.out.println(student);
}
}
}
2. Comparator接口:
-
- 强行对某个对象进行整体排序;
-
- 可以将Comparator的实现传递给sort方法(
Collections.sort
、Arrays.sort不好用
两个参数),从而实现在排列顺序上精确控制
- 可以将Comparator的实现传递给sort方法(
-
- 使用Comparator来控制某些数据结构(有序set或者有序映射),后者为哪些没有自然顺序的对象collection提供排序。
import java.util.ArrayList;
import java.util.Collections;
public class Student03{
private String name;
private int age;
public Student03(String name, int age) { this.name = name;this.age = age; }
public Student03() { }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override
public String toString() {
return \"Student{\" +\"name=\'\" + name + \'\\\'\' +\", age=\" + age + \'}\';
}
public static void main(String[] args) {
ArrayList arrayList = new ArrayList<>();
arrayList.add(new Student03(\"a\", 20));
arrayList.add(new Student03(\"c\", 18));
arrayList.add(new Student03(\"a\", 18));
arrayList.add(new Student03(\"a\", 16));
/**
Collections.sort(arrayList, new Comparator() {
@Override
public int compare(Student03 o1, Student03 o2) {
// 按照年龄升序排列,如果年龄一样就按照姓名字典序升序排序
int result = o1.getAge() - o2.getAge();
if(result == 0) {
result = o1.name.compareTo(o2.getName());
}
return result;
}
});*/
// lamda
Collections.sort(arrayList, (o1, o2) -> {
int result = o1.getAge() - o2.getAge();
if(result == 0) {
result = o1.name.compareTo(o2.getName());
}
return result;
});
for (Student03 student : arrayList) {
System.out.println(student);
}
}
}