【问题标题】:get columns from two dimensional array in java从java中的二维数组中获取列
【发布时间】:2022-01-06 21:52:08
【问题描述】:

在二维数组中,我可以轻松获取行的数组,如何将列也作为数组获取?我需要一个也适用于对象的解决方案,而不仅仅是原语。谢谢

        int counter = 1;
    int[][] matrix = new int[9][9];

    for (int x = 0; x < matrix.length; x++) {
        for (int y = 0; y < matrix[0].length; y++) {
            matrix[x][y] = counter;
            System.out.print(counter + " ");
            counter++;
        }
        System.out.println();
    }

    for (int x = 0; x < matrix.length; x++) {
        int[] row = matrix[x];  
    }

【问题讨论】:

  • 如果其中一个答案解决了您的问题,请将其标记为已接受的答案。

标签: java multidimensional-array


【解决方案1】:

没有简单的方法。您必须遍历数组并自己构造列数组。

您应该注意,如果您的二维数组具有不同长度的行,则“列数组”的定义不明确。例如,如果第 2 行只有 2 列,您将如何创建第 3 列数组?

如果您的二维数组是一个矩阵(即所有行的长度相同),那么创建一个二维数组就很容易了,它的行是原始二维数组的列。然后就可以轻松获取原始数组的列了。

【讨论】:

    【解决方案2】:

    你可以这样做:

    for(int row = 0; row < numRows; row++) {
        colArray[row] = my2Darray[row][columnOfInterest];
    }
    

    Apache commons 有这方面的工具,请查看this answer

    【讨论】:

      【解决方案3】:

      没有“开箱即用”的方法,但您可以为此创建一个静态方法:

      public static Object[] getColumn(Object[][] array, int index){
          Object[] column = new Object[array[0].length]; // Here I assume a rectangular 2D array! 
          for(int i=0; i<column.length; i++){
             column[i] = array[i][index];
          }
          return column;
      }
      

      【讨论】:

        【解决方案4】:

        这是一个使用 Java 8 流的方法:

        int[] getColumn(int[][] matrix, int column) {
            return IntStream.range(0, matrix.length)
                .map(i -> matrix[i][column]).toArray();
        }
        

        如果你想处理太短的行:

        int[] getColumn(int[][] matrix, int column, int defaultVal) {
            return IntStream.range(0, matrix.length)
                .map(i -> matrix[i].length < column ? defaultVal : matrix[i][column])
                .toArray();
        }
        

        【讨论】:

          【解决方案5】:

          这是另一个适用于对象的 Java 8 答案:

          // Make 2D array of objects
          Obj[][] obj = {{new Obj(0),new Obj(1)},{new Obj(2),new Obj(3)}};
          
          // To get a row:
          int rowToGet = 1;
          Obj[] oRow = obj[rowToGet];
          
          // To get a column:
          int colToGet = 1;
          Obj[] oCol = Arrays.stream(obj).map(o -> o[colToGet]).toArray(Obj[]::new);
          
          // Print the row:
          System.out.println(Arrays.toString(oRow));
          // Print the column:
          System.out.println(Arrays.toString(oCol));
          
          // Here is the object used for this example
          class Obj {
              int in;
              String str;
          
              public Obj(){};
          
              public Obj(int in){
                  this.in = in;
                  switch(in){
                      case 0:
                          str = "zero";
                          break;
                      case 1:
                          str = "one";
                          break;
                      case 2:
                          str = "two";
                          break;
                      case 3:
                          str = "three";
                          break;
                  }
              }
          
              @Override
              public String toString(){
                  return String.format("%d=%s",in,str);
              }
          }
          

          这将产生输出:

          Extracted row: [2=two, 3=three]
          Extracted col: [1=one, 3=three]

          【讨论】:

            【解决方案6】:

            你可以这样做:

            private <T> T[] getColumn(int address, T[][] from) {
                return (T[]) Arrays.stream(from).map(x -> x[address]).toArray(Object[]::new);
            }
            

            【讨论】:

              【解决方案7】:

              如上所述没有直接的方法来获取列长度,但有一个解决方案

              out[][]=new String[a][b] // Example of multidimensional array
              

              要获取列的长度,out[][]的长度 这样做:-

              String []temp = out[a] //a = index of row of which columns you want
              int length = temp.legnth;
              

              对不起,我不擅长解释

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-11-09
                • 1970-01-01
                • 2012-06-20
                • 1970-01-01
                • 1970-01-01
                • 2016-08-26
                相关资源
                最近更新 更多