o1表示位于前面的对象,o2表示后面的对象,如何按照指定顺序排序呢?
java7排序:
compare方法大于0,就把前一个数和后一个数交换,如果小于等于0就保持原位置,不进行交换。
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 4, 5, 8, null, 10, 9);
System.out.println(list);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 == null || o2 == null)
return -1;
if (o1.compareTo(o2) > 0) {
return 1;
} else if (o1.compareTo(o2) < 0) {
return -1;
} else {
return 0;
}
}
});
System.out.println(list);
}
运行结果为:
[1, 4, 5, 8, null, 10, 9]
[null, 1, 4, 5, 8, 9, 10]
我们看一下上面的compare函数,o1.compareTo(o2) > 0那么说明此时o1要大于o2,而此时return 1,我们上面说了,重载的compare返回值大于0那么就会对调,也就是将o1和o2对调,也就是小的数放在左边,大数放在右边,这就是典型的升序。
如果这里改成
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 4, 5, 8, null, 10, 9);
System.out.println(list);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 == null || o2 == null)
return 1;
if (o1.compareTo(o2) > 0) {
return -1;
} else if (o1.compareTo(o2) < 0) {
return 1;
} else {
return 0;
}
}
});
System.out.println(list);
}
[1, 4, 5, 8, null, 10, 9]
[10, 9, 8, 5, 4, 1, null]
此时就是降序了,还是拿刚刚的o1.compareTo(o2) > 0来举例子,此时那么说明此时o1要大于o2,而此时return -1,我们上面说了,重载的compare返回值大于0那么就会对调,而这里小于0,所以o1和o2不用对调,大数o1在左边,小数o2在右边,这就是典型的降序。
java8排序
那java8中如何优雅的排序呢?
comparator 是一个函数式接口,对接口进行了增强(增加了相当多的默认方法)。
- reversed 倒叙
- comparing 比较器(comparingInt 、 comparingLong、comparingDouble)
- thenComparing 之后比较(串联比较),如果第一个比较器确定不了顺序,thenComparing 才会有效果
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student(8, 80));
list.add(new Student(7, 70));
list.add(new Student(7, 65));
//升序
list.sort(Comparator.comparingInt(Student::getAge));
//降序
list.sort(Comparator.comparingInt(Student::getAge).reversed());
//先以年龄降序,后以身高升序
list.sort(Comparator.comparingInt(Student::getAge).reversed().thenComparingInt(Student::getHeight));
list.stream().forEach(s->System.out.println(s));
}
执行结果:
Student{age=8, height=80}
Student{age=7, height=65}
Student{age=7, height=70}