• 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
  • 相关阅读:
    MySQL安装、修改默认字符集、添加path路径 (超详细,带图文)
    数字孪生行业政策梳理--数字孪生能源领域相关政策(可下载)
    从ObjectPool到CAS指令
    Spring篇---第一篇
    LeetCode 138. Copy List with Random Pointer【链表,DFS,迭代,哈希表】中等
    如何成为一个全栈数字化设计师
    DJYGUI系列文章六:GK程序示例
    View#post(Runnable)的执行流程
    C++之类型转换
    有什么软件可以免费压缩图片?
  • 原文地址:https://blog.csdn.net/GDFHGFHGFH/article/details/125897174