簡體   English   中英

如何計算參差不齊的二維數組的列長度?

[英]How do I calculate the column length of a ragged 2d array?

我想計算二維數組中行和列的長度。 我知道如何做行部分但是我不知道如何在這個數組中找到列的長度。

public class array2D {
    public static void main(String args[]) {
        int maxNumberOfColumns = 8;
        Integer[][] j = {
                {2, 4, 8, 5, 1, 3, 7, 2},
                {6, 7, 4, 8, 2},
                {2, 3, 5, 9, 7, 1}};

        for (int row = 0; row < j.length; row++) {
            for (int col = 0; col < j[row].length; col++) {
                System.out.print(j[row][col] + "  ");
            }
            System.out.println();
        }

        System.out.println();
        System.out.println("------------");
        System.out.println();

        for (int row = 0; row < j.length; row++) {
            System.out.println("row "+row+" has "+j[row].length+" elements");
        }
        System.out.println();

        for (int col = 0; col < maxNumberOfColumns; col++) {
            //code I don't know
        }
    }
}

您可以將最后一個 for 循環更改為以下以打印每列的計數。 我在這里使用一個內部循環來計算元素的數量

for (int col = 0; col < maxNumberOfColumns; col++) {
    int count = 0;
    for (int i = 0; i < j.length; i++) {
        if (j[i].length > col) {
            count++;
        }
    }
    System.out.println("Column " + (col + 1) + " has " + count + " elements");
}

另一種解決方案是計算第一個循環中的最小列數,使用

minNumberOfColumns = length < minNumberOfColumns ? length : minNumberOfColumns;

然后將最后一個循環更改為

System.out.println("Column 1 to " + minNumberOfColumns + " has " + j.length + " elements");
for (int col = minNumberOfColumns; col < maxNumberOfColumns; col++) {
    int count = 0;
    for (int i = 0; i < j.length; i++) {
        if (j[i].length > col) {
            count++;
        }
    }
    System.out.println("Column " + (col + 1) + " has " + count + " elements");
}

您不需要maxNumberOfColumns變量。 相反,只要元素存在,您就可以計算元素,否則為0

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

// count of elements in the columns
int[] count = Arrays.stream(arr)
        .filter(Objects::nonNull)
        // for each row take an array
        // of the same length, filled with '1'
        .map(row -> IntStream
                .range(0, row.length)
                .map(i -> 1)
                .toArray())
        // summing elements in rows, if any, or '0' otherwise
        .reduce((row1, row2) -> IntStream
                .range(0, Math.max(row1.length, row2.length))
                .map(i -> (i < row1.length ? row1[i] : 0)
                        + (i < row2.length ? row2[i] : 0))
                .toArray())
        .orElse(null);

System.out.println(Arrays.toString(count));
// [3, 3, 3, 3, 3, 2, 1, 1]

另請參閱:首先按列填充鋸齒狀二維數組

此代碼將解決您的問題:

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

for (int row = 0; row < j.length; row++) {
    for (int col = 0; col < j[row].length; col++) {
        System.out.print(j[row][col] + "  ");
    }
    System.out.println();
}

System.out.println();
System.out.println("------------");
System.out.println();
int max = 0;
for (int row = 0; row < j.length; row++) {
    System.out.println("row " + row + " has " + j[row].length + " elements");
    if (j[row].length > max) {
        max = j[row].length;
    }
}
for (int k = 0; k < max; k++) {
    int count = 0;
    for (int row = 0; row < j.length; row++) {
        try {
            if (j[row][k] != null) {
                count = count + 1;
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            continue;
        }
    }
    System.out.println("Column " + k + " has " + count + " elements");
}
System.out.println();

暫無
暫無

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

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