基本概念
实现比较要满足的三个条件
- x,y的比较结果和y,x的比较结果相反(自反性)
- x > y,y > z则x > z
- x = y,则x,z比较结果和y,z比较结果相同
不满足以上三个条件的比较器在实际比较过程中可能会抛出异常
java.lang.Comparable
我们可以将要比较的对象类实现这个接口的compareTo()方法,然后通过调用stream().sorted(),会按照我们制定的比较规则排序
java.util.Comparator
我们可以new一个比较器,通过实现其中的compare()完成比较
常用排序方法
public class SortTest {
public static void main(String[] args) {
Student s1 = new Student();
s1.setAge(24);
s1.setName("zhangsan");
Student s2 = new Student();
s2.setAge(21);
s2.setName("lisi");
Student s3 = new Student();
s3.setAge(32);
s3.setName("wangwu");
Student s4 = new Student();
s4.setAge(11);
s4.setName("huangliu");
List<Student> students = Arrays.asList(s1, s2, s3, s4);
// 方式一:通过转换为stream流调用sorted,该方法Student需要实现Comparable接口中的compareTo()
List<Student> sort1 = students.stream().sorted().collect(Collectors.toList());
System.out.println(sort1);
// 方式二:通过实现Comparator的compare方法完成排序
List<Student> sort2 = students.stream().sorted(Comparator.comparing(Student::getName))
.collect(Collectors.toList());
// 方式三:按名称排序,但是wang开头的同学排在最前
Collections.sort(students, (o1, o2) -> {
// 分情况讨论
if (o1.getName().startsWith("wang") && !o2.getName().startsWith("wang")) {
// 左wang右不wang
return -1;
} else if (!o1.getName().startsWith("wang") && o2.getName().startsWith("wang")) {
// 右wang左不wang
return 1;
} else {
// 左右均wang 或 左右均不wang
return o1.getName().compareTo(o2.getName());
}
});
// 方式四:通过数组的sort()方法排序
students.sort(Comparator.comparing(m -> m.name));
System.out.println(students);
}
}
@Data
public class Student implements Comparable<Student> {
String name;
Integer age;
@Override
public int compareTo(Student s1) {
return this.name.compareTo(s1.name);
}
}
方式一种使用无参的stream().sorted()方法比较对象一定要实现Comparable接口,否则会抛出Exception in thread "main" java.lang.ClassCastException: sort.Student cannot be cast to java.lang.Comparable