Search code examples
javaarraysmultidimensional-arraycolumnsorting

Sorting 2D array of integers by column


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 element in a column. Let me explain that with an example. Consider as an input for the method a 2D arrays of 5x5 as follow:

int[][] array = new int[][]{
        {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}};

Now I need to build a new 2D array of integer (I will call newArray in the following) according to:

  • The minimum value of column 0 in the array is 0 and is associated with row 1 (then, I need to assign a 1 in newArray[0][0]).

  • Next, the minimum value of column 0 in the array is 24 and is associated with row 4 (then, I need to assign a 4 in newArray[1][0]).

  • Then, the minimum value of column 0 in the array is 124 and is associated with row 0 (then, I need to assign a 0 in newArray[2][0]).

  • And so on for each column...

The final output of the method must be something like the following 2d array.

enter image description here

Any help would be highly appreciated.


Solution

  • 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 !