簡體   English   中英

遍歷二維數組以獲取可變大小的列

[英]Traverse 2d array for variable size column wise

我有這樣的二維數組

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

如何做到這一點?

這是一個有效的簡單解決方案,如果您需要澄清,請告訴我

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

這是一個基於 stream 的解決方案:

    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)

我認為代碼很容易解釋,但如果你有問題,請隨時問他們

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 

這是我的建議,基於這樣的想法,如果你知道最長數組的長度,一切都會變得更簡單:)

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]+",");
        }
    }
}

嘗試這個。

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

output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM