关于排序的相关记录
先给出一个对象,如果希望将其按特别的方式进行排序:先根据总分降序,再根据数学降序,语文降序,最后根据名称字母顺序排序(这里没有写get,set方法):
public class SortModel {
private String name;
private Integer chinese;
private Integer math;
private Integer english;
private Integer score;
}
然后数据如下:
变量名 | score | math | english | chinese | name |
---|---|---|---|---|---|
mike | 290 | 100 | 95 | 95 | MIke |
jack | 290 | 100 | 95 | 95 | Jack |
test1 | 290 | 100 | 95 | 95 | test1 |
test2 | 290 | 100 | 95 | 95 | test2 |
test3 | 290 | 100 | 95 | 95 | test3 |
test4 | 290 | 100 | 95 | 95 | test4 |
test5 | 290 | 100 | 95 | 95 | test5 |
自然排序
方式:实现Comparabe接口的comparaTo方法
示例:
public class SortModel implements Comparable<SortModel> {
private String name;
private Integer chinese;
private Integer math;
private Integer english;
private Integer score;
@Override
public int compareTo(SortModel o) {
// 先根据总分从高到低排序
int compare = o.score.compareTo(this.score);
if (compare != 0) {
return compare;
}
// 如果总分相同,再根据数学成绩从高到低排序
compare = o.math.compareTo(this.math);
if (compare != 0) {
return compare;
}
// 如果数学成绩也相同,再根据语文成绩从高到低排序
compare = o.chinese.compareTo(this.chinese);
if (compare != 0) {
return compare;
}
// 如果语文成绩也相同,最后根据名字的自然顺序排序
return this.name.compareTo(o.name);
}
}
测试类
public class Test {
public static void main(String[] args) {
List<SortModel> list = Arrays.asList(mike, jack, test1, test2, test3, test4, test5);
System.out.println(list.stream().map(SortModel::getName).collect(Collectors.toList()));
System.out.println("---------------------");
// 不会变更原数据
System.out.println(list.stream().sorted().map(SortModel::getName).collect(Collectors.toList()));
System.out.println("---------------------");
// 会变更原数据
Collections.sort(list);
System.out.println(list.stream().map(SortModel::getName).collect(Collectors.toList()));
}
}
Stream流的定制排序
public class Test {
public static void main(String[] args) {
List<SortModel> list = Arrays.asList(mike, jack, test1, test2, test3, test4, test5);
System.out.println(list.stream().map(SortModel::getName).collect(Collectors.toList()));
System.out.println("---------------------");
// 如果原来的类没有实现Comparable中的comparaTo方法,stream流也支持排序(注意要先将上面的部分数据删除)
System.out.println(
list.stream().sorted(Comparator.comparing(SortModel::getScore).reversed()
.thenComparing(Comparator.comparing(SortModel::getMath).reversed())
.thenComparing(Comparator.comparing(SortModel::getChinese).reversed())
.thenComparing(SortModel::getName))
.map(SortModel::getName)
.collect(Collectors.toList())
);
}
}
这一块注意使用.thenComparing时如果需要逆序排,需要在其中写Comparator.comparing(SortModel::getMath).reversed()这种,如果顺序排,则直接SortModel::getMath就好了
附录
生成数据:
SortModel mike = SortModel.builder()
.score(290)
.math(100)
.english(95)
.chinese(95)
.name("Mike")
.build();
SortModel jack = SortModel.builder()
.score(290)
.math(100)
.english(95)
.chinese(95)
.name("Jack")
.build();
SortModel test1 = SortModel.builder()
.score(290)
.math(98)
.english(95)
.chinese(97)
.name("test1")
.build();
SortModel test2 = SortModel.builder()
.score(291)
.math(100)
.english(96)
.chinese(95)
.name("test2")
.build();
SortModel test3 = SortModel.builder()
.score(290)
.math(99)
.english(94)
.chinese(97)
.name("test3")
.build();
SortModel test4 = SortModel.builder()
.score(290)
.math(100)
.english(96)
.chinese(94)
.name("test4")
.build();
SortModel test5 = SortModel.builder()
.score(290)
.math(100)
.english(94)
.chinese(96)
.name("test5")
.build();