• java排序之compareTo方法和Comparator<T>接口


    compareTo

    • 源码
    public int compareTo(String anotherString) {
            int len1 = value.length;
            int len2 = anotherString.value.length;
            int lim = Math.min(len1, len2);
            char v1[] = value;
            char v2[] = anotherString.value;
    
            int k = 0;
            while (k < lim) {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2) {
                    return c1 - c2;
                }
                k++;
            }
            return len1 - len2;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 分析
      1.首先获取到两个字符串转为char数组后的长度,选出小的那个当做界值
      2.开始遍历比较两个char数组,比较同一坐标下两个字符的十进制值,如果不相等,就进行运算,把两个字符的差值进行运算,并返回,如果相等,下标值递增,继续循环。
      3.如果遍历结束,已经超出界值,就把两个char数组的长度相减后的值作为返回值

    实例

            List<String> list = new ArrayList<>();
            list.add("asd");
            list.add("bsd");
            list.add("csd");
            list.add("dsd");
            list.add("esd");
            list.add("fsd");
            Collections.sort(list, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    String s1 = String.valueOf(o1);
                    String s2 = String.valueOf(o2);
                    return s1.compareTo(s2);
                }
            });
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Comparator接口

    上面比较的是基础类,如果是自定义类的话,可以自定义比较条件

    List<User> listUser = new ArrayList<>();
            listUser.add(new User("ZHANGSAN",15));
            listUser.add(new User("LISI",19));
            listUser.add(new User("WANGWU",16));
            Collections.sort(listUser, new Comparator<User>() {
                @Override
                public int compare(User o1, User o2) {
                    /**
                     * 按照年龄来排序
                     */
                    //return o1.getAge()-o2.getAge();  正序
                    return o2.getAge()-o1.getAge();//倒序
                }
            });
            System.out.println(listUser);
            Collections.sort(listUser, new Comparator<User>() {
                @Override
                public int compare(User o1, User o2) {
                    /**
                     * 按照名字来排序  (在Unicode编码里)
                     */
                    //return o1.getAge()-o2.getAge();  正序
                    return o2.getName().compareTo(o1.getName());//倒序
                }
            });
            System.out.println(listUser);
    
            Collections.sort(listUser, new Comparator<User>() {
                        @Override
                        public int compare(User o1, User o2) {
                            return 0;
                        }
                    });
                    System.out.println(listUser);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    Python柱形图
    禅道bug同步到飞书
    【自留地】后端 - PHP - MySQL - Nginx - Python - Java
    学习分布式第一天(分布式系统原理和概念)
    腾讯云4核8G服务器申请费用多少?性能如何?支持几个人?
    一号店调用api实例讲解
    SpringCloud 微服务应用篇 | (4)Feign远程调用
    人工智能Python语音识别练习
    普通蓝牙防丢器已过时,onn推出支持苹果 Find My 防丢器
    Linux —— linuxdeployqt源码编译与打包
  • 原文地址:https://blog.csdn.net/GDFHGFHGFH/article/details/125897174