将2D阵列中的列值分配到各个群集

时间:2016-05-23 11:01:08

标签: java multidimensional-array

我很难根据排序值将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.然后它将移至下一列并重做。< / p>

例如:

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 个答案:

答案 0 :(得分:0)

我不建议按原样使用它,但可能有帮助

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);
}

答案 1 :(得分:0)

您可以使用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
        }
    }