java实战:多属性排序

多属性排序的核心点就是对Arrays.sort()和Collections.sort()方法的Comparator进行重写

  1. Arrays.sort()的三种用法

1.1、Arrays.sort(int[] a)  这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序。较常用

1.2、Arrays.sort(int[] a, int fromIndex, int toIndex) 

这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序!

1.3、对Comparator进行重写,即多属性排序,以二维数组为例,共列举两种场景:

场景1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
        int[][] arr = {{2, 6, 4}, {6, 5, 7}, {6, 1, 1}};
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
               return o1[1]-o2[1]; // 按第2列升序排列   return o1[0]-o2[0] 表示按第一列排序
        });
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }

  

场景:2:按二维数组的第一列升序排序,如果第一列值相同,就按第二例降序排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) {
        int[][] arr = {{2, 6, 4}, {6, 5, 7}, {6, 1, 1}};
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                    if(o1[0]>o2[0]){
                        return 1;
                    }else if(o1[0]<o2[0]){
                        return -1;
                    }else{
                        return o2[1]-o1[1];
                    }
            }
        });
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }

场景3:按二维数组的第一列升序排序,如果第一列值相同,就按第二例升序排序,如果第二列值相同,就按第3列升序排序,以此类推。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) {
        int[][] arr = {{2, 6, 4}, {6, 5, 7}, {6, 1, 1}};
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                for(int k=0;k<arr.length;k++){ // 下面这块就表示://如果按一条件比较结果相等,就使用第二个条件进行比较。
                    if(o1[k]>o2[k]){
                        return 1;
                    }else if(o1[k]<o2[k]){
                        return -1;
                    }else{
                        continue;
                    }
                }
                return 0;
            }
        });
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }

 

总结:升序:o1-o2  降序:o2-o1  如果compare() 入参是基本数据类型 或char类型可以直接用减号“-”, 

如果compare() 入参是Byte, Double, Integer, Float, Long 或 Short 这些包装类型,或者是String类型,可以替换如下:

升序:o1.compareTo(o2 )      降序:o2.compareTo(o1 

  1. Collections.sort()的用法

场景1:对于字符串类型的集合进行排序,按首字母升序,如果第一列值相同,就按照第二列降序排列。

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
public static void main(String[] args) {
        List<String> ls = new LinkedList<>();
        ls.add("abdh");
        ls.add("bmkhy");
        ls.add("cbdga");
        ls.add("aasd");
//        Collections.sort(ls); //默认是按字典序列升序
 
        // 按首字母升序,如果第一列值相同,就按照第二列降序排列,以此类推
        Collections.sort(ls, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
//                return o1.compareTo(o2); // 升序   如果是基本类型的包装类型,也可以用o1-o2,或o2-o1
                if (o1.charAt(0) > o2.charAt(0)) {
                    return 1;
                } else if (o1.charAt(0) < o2.charAt(0)) {
                    return -1;
                } else { // 即o1.charAt(0) = o2.charAt(0) 返回值是0
                    return o2.charAt(1) - o1.charAt(1);
                }
            }
        });
 
        for (int i = 0; i < ls.size(); i++) {
            System.out.println(ls.get(i));
        }
    }

  

场景2:对于字符串类型的集合进行排序,按首字母升序,如果第一列值相同,就按照第二列升序排列,如果第2列值相同,就按照第3列升序排列,以此类推。。

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
        List<String> ls = new LinkedList<>();
        ls.add("abdh");
        ls.add("bmkhy");
        ls.add("cbdga");
        ls.add("aasd");
        Collections.sort(ls, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
               return o1.compareTo(o2); //compareTo()方法比较的时候是按照ASCII码逐位比较的 } <br>}); <br>for (int i = 0; i < ls.size(); i++) { System.out.println(ls.get(i)); } }

 

场景2结果:

 

posted @   Justin_Hu  阅读(670)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示