Sorting 2D array of integers by column

后端 未结 2 807
攒了一身酷
攒了一身酷 2021-01-23 08:03

I need to build a method in Java where the input is a 2D array of integers and get as a result a 2D array of integers where each element makes reference to a position of an elem

相关标签:
2条回答
  • 2021-01-23 08:19

    Sorting the indexes of matrix elements by columns is sorting the indexes of elements by the rows of a transposed matrix:

    int m = 5;
    int n = 6;
    int[][] arr1 = new int[][]{
            {124, 188, 24, 254, 339, 3},
            {0, 7, 77, 145, 159, 1},
            {206, 340, 280, 523, 433, 5},
            {310, 265, 151, 411, 398, 4},
            {24, 104, 0, 183, 198, 2}};
    
    int[][] arr2 = IntStream
            // iterate over the indices
            // of the rows of the array
            .range(0, n)
            .mapToObj(i -> IntStream
                    // iterate over the
                    // indices of the columns
                    .range(0, m)
                    .boxed()
                    // sort indices of the elements of the
                    // columns by its values in the array
                    .sorted(Comparator.comparingInt(j -> arr1[j][i]))
                    .mapToInt(Integer::intValue)
                    // sorted column of indices is
                    // a row in the new array
                    .toArray())
            // return sorted array of indices
            .toArray(int[][]::new);
    
    // transpose the array of indices
    int[][] arr3 = new int[m][n];
    IntStream.range(0, m).forEach(i ->
            IntStream.range(0, n).forEach(j ->
                    arr3[i][j] = arr2[j][i]));
    
    // output
    Arrays.stream(arr3).map(Arrays::toString).forEach(System.out::println);
    

    Output:

    [1, 1, 4, 1, 1, 1]
    [4, 4, 0, 4, 4, 4]
    [0, 0, 1, 0, 0, 0]
    [2, 3, 3, 3, 3, 3]
    [3, 2, 2, 2, 2, 2]
    
    0 讨论(0)
  • 2021-01-23 08:21

    If I understood correctly :

    IN :
         {{124, 188, 24,  254, 339},
          {0,   7,   77,  145, 159},
          {206, 340, 280, 523, 433},
          {310, 265, 151, 411, 398},
          {24,  104, 0,   183, 198}}
    
    OUT :
         {{1, 1, 4, 1, 1}
          {4, 4, 0, 4, 4}
          {0, 0, 1, 0, 0}
          {2, 3, 3, 3, 3}
          {3, 2, 2, 2, 2}
    

    Here's the code :

    public static int[][] createArray(int[][] a) {
        int[][] nA = new int[a.length][a[0].length];
        int[] col = new int[a.length];
        int minIndex = -1;
        for (int i = 0; i < a.length; i++) {
            // First get the col out
            for (int j = 0; j < a[0].length; j++) {
                col[j] = a[j][i];
            }
            // Loop through the col
            for (int k = 0; k < a[0].length; k++) {
                int min = Integer.MAX_VALUE;
                // Loop through the remaining numbers of the col
                for (int j = 0; j < col.length; j++) {
                    // Find the remaining lowest number
                    if (min > col[j]) {
                        min = col[j];
                        minIndex = j;
                    }
                }
                // Delete the number from the array
                col[minIndex] = Integer.MAX_VALUE;
                // Set this number in the final array
                nA[k][i] = minIndex;
            }
        }
        return nA;
    }
    

    There might be an easier way, but it works !

    0 讨论(0)
提交回复
热议问题