zoukankan      html  css  js  c++  java
  • 二维数组排序

    参考:

    https://www.cnblogs.com/rujianming/p/11779922.html

    https://blog.csdn.net/westwewe/article/details/103515556

    https://blog.csdn.net/chao_ji_cai/article/details/100072293

    java中Arrays.sort()对二维数组进行排序

    int [][]a = new int [5][2];

    //定义一个二维数组,其中所包含的一维数组具有两个元素

    对于一个已定义的二位数组a进行如下规则排序,首先按照每一个对应的一维数组第一个元素进行升序排序(即a[][0]),若第一个元素相等,则按照第二个元素进行升序排序(a[][1])。(特别注意,这里的a[][0]或者a[][1]在java中是不能这么定义的,这里只是想说明是对于某一个一维数组的第0或1个元素进行排序)

    Arrays.sort(a, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
    if (o1[0]==o2[0]) return o1[1]-o2[1];
    return o1[0]-o2[0];
    }
    });
    其中o1[1]-o2[1]表示对于第二个元素进行升序排序如果为o2[1]-o1[1]则表示为降序。

    Java二维数组排序的简单实现

    方法一:重写Arrays.sort方法

    待排序的数组形式int[][] array = new int[n][2],其中n为任意整数。排序逻辑为:按第一列升序排列;若第一列数字相等,按第二列升序排列。

    import java.util.Arrays;
    import java.util.Comparator;
    
    public class Sort {
        public static int[][] mySort(int[][] array){
            // 新建一个比较器Comparator作为匿名内部类
            Arrays.sort(array, new Comparator<int[]>() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    if(o1[0] == o2[0]){
                        // 若俩数组的第一个元素相等,则比较它们的第二个元素
                        return o1[1] - o2[1];
                    }else {
                        // 若俩数组的第一个元素不相等,则按从小到大的顺序排列
                        return o1[0] - o2[0];
                    }
                }
            });
            return array;
        }
        public static void main(String[] args){
            // 输入测试数据
            int[][] arr = new int[][]{{1,3},{2,4}, {2,6},{8,10},{8,18}, {15,18}};
            int[][] sorted = mySort(arr);
            // 输出测试结果
            for(int[] a : sorted){
                System.out.println(a[0] + "," + a[1]);
            }
        }
    }

    方法二:简化版重写Arrays.sort方法

    import java.util.Arrays;
    
    public class Sort {
        public static int[][] mySort(int[][] array){
            Arrays.sort(array, (arr1, arr2) -> arr1[0] == arr2[0] ? arr1[1] - arr2[1] : arr1[0] - arr2[0]);//lambda:Arrays.sort(matrix, (a, b) -> a[0] - b[0]);
            return array;
        }
        public static void main(String[] args){
            int[][] arr = new int[][]{{1,3},{2,4}, {2,6},{8,10},{8,18}, {15,18}};
            int[][] sorted = mySort(arr);
            for(int[] a : sorted){
                System.out.println(a[0] + "," + a[1]);
            }
        }
    }

    排序结果

    1,3
    2,4
    2,6
    8,10
    8,18
    15,18

    使用Arrays.sort对二维数组分别按行和列排序(Java)

     

     按行排序:

    对二维数组按行排序,直接调用Arrays.sort就行:

    private static int [][] sortRows(int[][] arr) {//行排序
    		for (int i = 0; i < arr.length; i++) {
    			Arrays.sort(arr[i]);
    		}
    		return arr;
    	}

    执行结果:
    原数组:[323, 336, 169, 841, 744]
    原数组:[590, 340, 204, 386, 405]
    原数组:[152, 646, 765, 520, 891]
    
    按行排序:[169, 323, 336, 744, 841]
    按行排序:[204, 340, 386, 405, 590]
    按行排序:[152, 520, 646, 765, 891]
     

    按指定列排序:

    使用比较器创建内部类:

    Arrays.sort(arr, new Comparator<int[]>() {//按二维数组每一行第一列,对列进行排序
        @Override
        public int compare(int[] o1, int[] o2) {
            return o1[0] - o2[0];
        }
    });
    关注每一行的第一位,即是列的顺序
    原数组:[323, 336, 169, 841, 744]
    原数组:[590, 340, 204, 386, 405]
    原数组:[152, 646, 765, 520, 891]
    
    按列排序:[152, 646, 765, 520, 891]
    按列排序:[323, 336, 169, 841, 744]
    按列排序:[590, 340, 204, 386, 405]
     

    对列排序(从小到大),使用比较器创建内部类:

    Arrays.sort(arr, new Comparator<int[]>() {
    //按二维数组每一行第二列,对列进行排序
    @Override public int compare(int[] o1, int[] o2) { return o1[1] - o2[1]; } });
    关注每一行的第2位,此顺序为列的顺序
    原数组:[962, 852, 375, 332, 644]
    原数组:[829, 811, 387, 132, 984]
    原数组:[618, 859, 871, 448, 686]
    
    按列排序:[829, 811, 387, 132, 984]
    按列排序:[962, 852, 375, 332, 644]
    按列排序:[618, 859, 871, 448, 686]


    如果想要按列从大到小排序:

    Arrays.sort(arr, new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
            return o2[1] - o1[1];
        }
    });
    

    最简单的写法:使用lambda表达式

    对行:Arrays.sort(arr, Comparator.comparingInt(o -> o[0]));
    对列:Arrays.sort(arr, Comparator.comparingInt(o -> o[1]));

    排序代码以及执行结果:

    import java.util.Arrays;
    
    public class TwoArrays {
    
        public static void main(String[] args) {
            int[][] arr = new int[3][5];
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {//生成随机数【100-1000】
                    arr[i][j] = (int) (Math.random() * (1000 - 100 + 1) + 100);
                    System.out.print(arr[i][j]+" ");
                }
            }
            System.out.println();
            System.out.println();
    
            for (int i = 0; i < arr.length; i++) {
                System.out.println(Arrays.toString(arr[i]));
            }
            System.out.println();
            for (int i = 0; i < arr.length; i++) {
                Arrays.sort(arr[i]);
            }
            for (int i = 0; i < arr.length; i++) {
                System.out.println(Arrays.toString(arr[i]));
            }
            System.out.println();
    
    
            for(int i=0;i<arr.length;i++){
                System.out.print( arr[i][0]+" ");
            }
            System.out.println();
            System.out.println();
    
            System.out.println(Arrays.toString(arr));//打印的是对象
    
        }
    
    
    
    }

    执行结果:

    418 616 326 604 123 493 520 629 235 885 186 383 337 875 585 
    
    [418, 616, 326, 604, 123]
    [493, 520, 629, 235, 885]
    [186, 383, 337, 875, 585]
    
    [123, 326, 418, 604, 616]
    [235, 493, 520, 629, 885]
    [186, 337, 383, 585, 875]
    
    123 235 186 
    
    [[I@1517365b, [I@4fccd51b, [I@44e81672]
  • 相关阅读:
    Laravel 中使用支付宝、银联支付、微信支付进行支付
    C# 文件读写系列三
    C# 文件读写系列二
    C# Encoding
    C# 文件操作系列一
    Unity 依赖注入
    控制反转和依赖注入模式
    Aop学习笔记系列一
    C# lambda表达式
    C# 委托基础
  • 原文地址:https://www.cnblogs.com/xuwc/p/13945050.html
Copyright © 2011-2022 走看看