• java集合排序整理


    前言:很久没有写排序的方法,最近面试发现回答这类问题有点生疏,特此整理并复习一下相关知识。

    一:定义实体对象Cell

    public class Cell implements Comparable<Cell> {
        private int x;
        private int y;
        private int z;
        @Override
        public int compareTo(Cell o) {
            if (this.getX() != o.getX()) {
                // 若果X不相等,先对x排序
                return this.getX() - o.getX();
            } else if (this.getY() != o.getY()) {
                // 若x相等,然后通过Y排序
                return this.getY() - o.getY();
            } else {
                // 若x和y都相等,然后通过Z排序
                return this.getZ() - o.getZ();
            }
    
        }
    }
    public static List<Cell> getCells() {
        List<Cell> arrayList = new ArrayList<>();
        arrayList.add(new Cell(1, 1));
        arrayList.add(new Cell(5, 2));
        arrayList.add(new Cell(2, 2));
        arrayList.add(new Cell(2, 5));
        arrayList.add(new Cell(2, 3));
        arrayList.add(new Cell(3, 3));
        arrayList.add(new Cell(3, 2));
        arrayList.add(new Cell(5, 12));
        return arrayList;
    }

    二:自定义匿名实现Comparator接口类排序

        @Test
        public void test() {
            List<Cell> cells = TestCompare.getCells();
            cells.sort(new Comparator<Cell>() {
                @Override
                public int compare(Cell o1, Cell o2) {
                    if (o2.getX() == o1.getX()) {
                        return o2.getY() - o1.getY();
                    }
                    return o2.getX() - o1.getX();
                }
            });
            System.out.println(cells);
        }

    三:通过继承Comparable接口,compareTo方法

    @Test
    public void test2() {
        List<Cell> cells = TestCompare.getCells();
        Collections.sort(cells);
        System.out.println(cells);
    }

    四:java 1.8,通过继承Comparable接口,compareTo方法

    @Test
    public void test3() {
        List<Cell> cells = TestCompare.getCells();
        // 默认通过Cell的Comparable接口方法排序
        List<Cell> collect = cells.stream().sorted().collect(Collectors.toList());
        System.out.println(cells);
    }

    五:java 1.8 自定义匿名实现Comparator接口类排序

    @Test
    public void test4() {
        List<Cell> cells = TestCompare.getCells();
        // 默认通过Cell的Comparable接口方法排序
        List<Cell> collect = cells.stream().sorted(new Comparator<Cell>() {
            @Override
            public int compare(Cell o1, Cell o2) {
                if (o1.getX() != o2.getX()) {
                    // 若果X不相等,先对x排序
                    return o1.getX() - o2.getX();
                } else if (o1.getY() != o2.getY()) {
                    // 若x相等,然后通过Y排序
                    return o1.getY() - o2.getY();
                } else {
                    // 若x和y都相等,然后通过Z排序
                    return o1.getZ() - o2.getZ();
                }
            }
        }).collect(Collectors.toList());
        System.out.println(collect);
    }

    六:jdk1.8通过接口的静态方法Comparator.comparing,自定义排序字段,该字段会按自然排序

    @Test
    public void test6() {
        List<Cell> cells = TestCompare.getCells();
        List<Cell> collect = cells.stream().sorted(Comparator.comparing(c -> ((Cell) c).getX()).reversed())
                .collect(Collectors.toList());
        System.out.println(collect);
    }

    七:jdk1.8通过接口的静态方法Comparator.comparing,自定义排序字段+自定义排序器(Comparator)lambdab表达式实现

    @Test
    public void test7() {
        List<Cell> cells = TestCompare.getCells();
        List<Cell> collect = cells.stream().sorted(Comparator.comparing(c -> ((Cell) c).getX(), (m1, m2) -> {
            return m1 - m2;
        }).reversed()).collect(Collectors.toList());
        System.out.println(collect);
    }

    八:jdk1.8通过接口的静态方法Comparator.comparing(返回Comparator接口) + 方法引用Cell::getX

    @Test
    public void test5() {
        List<Cell> cells = TestCompare.getCells();
        List<Cell> collect = cells.stream()
                .sorted(Comparator.comparing(Cell::getX).reversed().thenComparing(Cell::getY).thenComparing(Cell::getZ))
                .collect(Collectors.toList());
        System.out.println(collect);
    }

    备注:如果是通过java1.8的stream()方法排序的,其不会影响原集合的顺序。

    其他:利用if - else if - else 实现了对多个字段的排序

  • 相关阅读:
    二叉树(链表形式)
    判断一个非空单链表是否是递增有序的
    指针的异或运算可用于交换两个变量的值
    JavaScript导论
    JavaScript语言的历史
    分享一个分页控件的实现思路
    MVC还是MVVM?或许VMVC更适合WinForm客户端
    基于NPOI的Excel数据导入
    一段用于地址清洗的代码
    模块3之手机号码格式的校验
  • 原文地址:https://www.cnblogs.com/jinliang374003909/p/13501667.html
Copyright © 2020-2023  润新知