Bootstrap

关于排序相关的内容记录

关于排序的相关记录

先给出一个对象,如果希望将其按特别的方式进行排序:先根据总分降序,再根据数学降序,语文降序,最后根据名称字母顺序排序(这里没有写get,set方法):

public class SortModel {

    private String name;

    private Integer chinese;

    private Integer math;

    private Integer english;

    private Integer score;
}

然后数据如下:

变量名scoremathenglishchinesename
mike2901009595MIke
jack2901009595Jack
test12901009595test1
test22901009595test2
test32901009595test3
test42901009595test4
test52901009595test5

自然排序

方式:实现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();
;