Назначение значений столбцов в 2D массиве отдельным кластерам

У меня есть трудности в назначении значений в 2D массиве в кластеры на основе их отсортированных значений. Может быть, немного трудно понять, но я объясню все, что смогу.

У меня есть 2D-матрица, как показано ниже.

[5.2, 3.0, 4.4, 6.1]
[0.1, 1.0, 6.9, 4.5]
[3.1, 3.3, 5.9, 1.3]

Теперь я хотел бы повторить первый столбец в каждой строке и назначить кластер (может быть массив/список) каждому значению ячейки столбца.

Таким образом, самое низкое значение в 2D столбце будет присвоено кластеру 1, второе самое низкое будет присвоено кластеру 2, третье самое низкое будет присвоено кластеру 3. Затем он перейдет к следующему столбцу и повторит.

Например:

First column
5.2 (3rd lowest value -> assign to cluster 3)
0.1 (lowest value -> assign to cluster 1)
3.1 (2nd lowest value -> assign to cluster 2) 

…затем перейдите ко второму столбцу. Дело в том, что столбец и строка динамические, поэтому я не мог использовать статическую переменную для массива кластера(номер кластера может измениться).

Таким образом, наконец, когда все кластеризовано, выходные данные из каждого кластера будут содержать что-то вроде этого:

double[] cluster1 = 0.1, 1.0, 4.4, 1.3; //contains the lowest value in each column
double[] cluster2 = 3.1, 3.0, 5.9, 4.5; //contains the 2nd lowest value in each column
double[] cluster3 = 5.2, 3.3, 6.9, 6.1 //contains the 3nd lowest value in each column
--- and if there's more row, number of cluster may increase...

Это код, который я пытался сделать до сих пор, но это только получить наименьшее значение из каждого столбца.

  int dynamicCol = 4;
  int dynamicRow = 3;

  for(int col=0;col<dynamicCol;col++)
  {
         for(int row = 0; row < dynamicRow; row++)
         {
             colArray[row] = cluster[row][col];
         }          
     System.out.println("Min in col "+(col+1)+": "+getMin(colArray));//this will find the lowest value in each column and store in an array
         cluster1.add(getMin(colArray));//store the lowest value in each column into cluster 1
     }

//getMin function to get lowest value in each column
 public static double getMin(double[] inputArray){ 
    double minValue = inputArray[0]; 
    for(int i=1;i<inputArray.length;i++){ 
      if(inputArray[i] < minValue){ 
        minValue = inputArray[i]; 
      } 
    } 
    return minValue; 
  } 

Ценю помощь в этом. Спасибо.

2 ответа

  1. Я бы не предложил использовать это как есть, но может помочь

    public static void main(String[] args){
    
        int[][] data = new int[][]{ {1,4,3},
                                    {2,1,4},
                                    {3,2,1},
                                    {4,3,2}};
        int row = data.length;
        int col = data[0].length;
    
        System.err.println(row+" rows");
        System.err.println(col + " columns");
    
        List<List<Integer>> clusters = new ArrayList<>(row);
        for(int i=0; i< row; i++){
            clusters.add(new ArrayList<Integer>(col));
        }
    
        List<Integer> temp = new ArrayList<>(col);
    
        for(int i=0; i< col; i++){
            temp.clear();
            for(int j=0; j< row; j++){
                temp.add(data[j][i]);
            }
            System.err.println(temp);
            Collections.sort(temp);
            for(int x = 0; x < row; x++){
                clusters.get(x).add(temp.get(x));
            }
        }
        System.err.println("Results");
        System.err.println(clusters);
    }
    
  2. Можно использовать Arrays.sort()метод для сортировки каждой строки массива, затем можно поместить каждое значение столбца в кластер той же позиции.

            int[][] my2DArray = new int[][]{
                {1,4,3},
                {2,1,4},
                {3,2,1},
                {4,3,2}};
        // Initialize list of clusters.
        List<List<Integer>> clusters = new ArrayList<List<Integer>>();
        for (int i = 0; i < my2DArray.length; i++) {
            clusters.add(new ArrayList<>());
        }
    
        for (int[] column : my2DArray) {
            Arrays.sort(column);
            for (int i = 0; i < column.length; i++) {
                clusters.get(i).add(column[i]); // Add the value to the cluster
            }
        }