List sort()自定义排序

前言

  • 本文使用环境为JDK8
  • sort()方法底层采用归并排序,时间复杂度为O(nlgn),空间复杂度为O(n),感兴趣的同学自行查阅源码,本文仅说明使用sort()方法进行自定义排序时的注意点

代码

public class Test {

    static class Node{

        String data;
        String seq;

        public Node(String data, String seq) {
            this.data = data;
            this.seq = seq;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "data='" + data + '\'' +
                    ", seq='" + seq + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {
        List<Node> nodeList = new ArrayList<>();
        nodeList.add(new Node("d","1"));
        nodeList.add(new Node("e","2"));
        nodeList.add(new Node("e","3"));
        nodeList.add(new Node("d","4"));

        //以下写法仅为示例
        //故意返回 1 0 -1
        //以下为求自定义的升序,这里认为data=“e”应该排在data="d"前面
        nodeList.sort(new Comparator<Node>() {
            //这里有一个注意点
            //入参o1在nodeList中的位置不一定在o2前面
            //这里仅仅代表两个入参
            @Override
            public int compare(Node o1, Node o2) {
                if (o1.data.compareTo(o2.data)>0){
                    //返回大于0的整型代表o1大于o2,o2应该排在o1前面
                    return 1;
                }else if(o1.data.compareTo(o2.data)==0){
                    //返回0代表o1等于o2,o1和o2不需要改变位置
                    return 0;
                }else{
                    //返回小于0的整型代表o1小于o2,o1应该排在o2
                    return -1;
                }
            }
        });

        for (Node node:nodeList){
            System.out.println(node);
        }
    }
}

输出

Node{data=‘d’, seq=‘1’}
Node{data=‘d’, seq=‘4’}
Node{data=‘e’, seq=‘2’}
Node{data=‘e’, seq=‘3’}

总结

  1. 入参o1在列表中的位置不一定在o2前面
  2. compare方法返回大于0的整型代表o1大于o2,o2应该排在o1前面
  3. compare方法返回0代表o1等于o2,o1和o2不需要改变位置
  4. compare方法返回小于0的整型代表o1小于o2,o1应该排在o2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值