【问题标题】:Traverse 2d array for variable size column wise遍历二维数组以获取可变大小的列
【发布时间】:2021-11-22 01:41:28
【问题描述】:

我有这样的二维数组

int[][] v = {{1,2,3}, {4,5}, {6,4,3,}, {1}, {7,8,9};

我希望它像这样打印出来

1,4,6,1,7,2,5,4,8,3,3,9 

我知道我们必须逐列遍历,但列的大小不是固定的。那么我该如何实现上述目标呢?

我尝试了以下方法,但它给出了 IndexArrayOutOfBoundException

for(int i = 0; i < v.length; i++){
      for(int j = 0; j< v[i].length; j++) {
    
          System.out.println(v[j][i]);
      
      }
    }

如何做到这一点?

【问题讨论】:

  • 不,它们的顺序是正确的 m v[i][j],只会按行打印。
  • 错字:应该是int[][] v = {{1,2,3}, {4,5}, {6,4,3,}, {1}, {7,8,9}};
  • 再次打错,应该是int[][] v = {{1,2,3}, {4,5}, {6,4,3}, {1}, {7,8,9}}; ;)

标签: java multidimensional-array traversal


【解决方案1】:

这是一个有效的简单解决方案,如果您需要澄清,请告诉我

public static void test(int[][] arr) {
    int i = 0;
    boolean found = true;
    while(found){
        found = false;
        for(int j = 0; j < arr.length; j++){
            if(arr[j].length-1 >= i){
                System.out.println(arr[j][i]);
                found = true;
            }
        }
        i++;
    }
}

【讨论】:

    【解决方案2】:

    这是一个基于流的解决方案:

        IntStream.iterate(0, i -> i + 1)
                .mapToObj(i -> IntStream.range(0, v.length)
                        .flatMap(j -> i < v[j].length ? IntStream.of(v[j][i]) : IntStream.empty())
                        .boxed().toList())
                .takeWhile(l -> !l.isEmpty())
                .flatMap(List::stream)
    

    【讨论】:

      【解决方案3】:

      我认为代码很容易解释,但如果您有任何问题,请随时提问

      public static void printColumns(int[][] array) {
          int largest = 0;
          for (int[] i:array) {
              if (i.length>largest) { // find the largest element in array
                  largest = i.length;
              }
          }
          for (int i=0;i<largest;i++) {
              for (int[] intArray : array) {
                  if (i < intArray.length) {  // check that you won't get an IndexOutOfBounds exception
                      System.out.print(intArray[i]+",");
                  }
              }
          }
          System.out.println("\b");  // removes last "," printed
      }
      

      输入

      {{1,2,3}, {4,5}, {6,4,3,}, {1}, {7,8,9}}
      

      输出:

      1,4,6,1,7,2,5,4,8,3,3,9 
      

      【讨论】:

        【解决方案4】:

        这是我的建议,基于这样的想法,如果你知道最长数组的长度,一切都会变得更简单:)

        int[][] v = {{1,2,3}, {4,5}, {6,4,3}, {1}, {7,8,9}};
        
        int maxLength = 0;
        for(int i = 0; i < v.length; i++){
            maxLength = v[i].length > maxLength ? v[i].length : maxLength;
        }
        
        for(int i = 0; i < maxLength; i++){
            for(int j = 0; j < v.length; j++){
                if(i < v[j].length){
                    System.out.print(v[j][i]+",");
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          试试这个。

          public static void main(String[] args) {
              int[][] v = {{1, 2, 3}, {4, 5}, {6, 4, 3}, {1}, {7, 8, 9}};
              boolean moreColumns = true;
              String sep = "";
              for (int c = 0, rows = v.length; moreColumns; ++c) {
                  moreColumns = false;
                  for (int r = 0; r < rows; ++r) {
                      if (c < v[r].length) {
                          System.out.print(sep + v[r][c]);
                          sep = ", ";
                          moreColumns = true;
                      }
                  }
              }
          }
          

          输出:

          1, 4, 6, 1, 7, 2, 5, 4, 8, 3, 3, 9
          

          【讨论】:

            猜你喜欢
            • 2023-03-04
            • 2016-09-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多