使用未指定变量行长度来创建多维数组 (Java)

3

我正在尝试使用多维数组进行一些操作。我是 Java 的新手,编程水平不是很高,而且在互联网上也找不到有关这个主题的任何其他信息,因此我想在这里问问。

本质上,我正在编写一个方法,将两个多维整数数组的值相加,以创建第三个多维数组。当多维数组是矩阵(例如,两个 2x3 的数组相加)时,这与矩阵加法相同,但如果我有一个具有可变行长度的多维数组,则不是这样。到目前为止,我的方法如下:

public static int[][] addMDArray(int[][] a, int[][] b)
{
    boolean columnequals = true;
    for (int row = 0; row < a.length; row++)
    {
        if (a[row].length != b[row].length)
        {
            columnequals = false;
        }
    }
    if (columnequals == false || a.length != b.length)
        System.out.println("The arrays must have the same dimensions!");
    else
    {
        int[][] sum = new int[a.length][a[0].length];
        for (int row = 0; row < a.length; row++)
        {
            for (int column = 0; column < a[row].length; column++)  
                sum[row][column] = a[row][column] + b[row][column];
        }
        return sum;
    }
    return null;
}

正如我所说,这个方法适用于没有可变行长度的MD数组; 然而,除了检查它们具有相同维度的第一部分之外,这种方法无法处理两个像这样的数组:
int[][] g = {{2, 1}, {3, 5, 4}, {5, 7, 7}};
int[][] d = {{1, 2}, {3, 4, 5}, {5, 6, 7}};

我遇到的问题是,我无法在不指定维度的情况下声明“sum”MD数组...是否有办法在for循环中创建sum数组?如果可能的话,我觉得这将是最简单的解决方案,但否则我不知道还能尝试什么。
任何帮助都将不胜感激!

嘿,与你的问题无关,但可能会在以后帮助到你。在创建了一个计算出高度和宽度的新矩阵之后,你可以使用System.arraycopy()。看看我写的这段代码,用于改变矩阵的大小:MatrixUtils.java - Mr. Polywhirl
为什么不垂直遍历数组,找到max(水平尺寸),然后用这个最大尺寸求和呢?有道理吗? - mawia
1个回答

2
你可以这样做:int[][] sum = new int[a.length][]; 是完全合法的。然后你可以执行 sum[i] = new int[a[i].length];,你的代码将会像这样:
    int[][] sum = new int[a.length][];
    for (int row = 0; row < a.length; row++)
    {
        sum[row] = new int[a[row].length];
        for (int column = 0; column < a[row].length; column++)  
            sum[row][column] = a[row][column] + b[row][column];
    }

请记住,Java中的多维数组实际上是一个数组的数组。(这不一定应该是这样的,但事实就是这样。)

(顺带说一句,当两个数组的维度不同时,你应该抛出IllegalArgumentException而不是返回null。这样你的代码将更易于使用。)


非常感谢!我之前不知道你可以声明一个多维数组,其中数组内的长度未被确定--这完全解决了这个问题。我同意你的观点,返回 null 看起来毫无用处。但是,这是我正在学习的Java 课程实验的一部分,并且我们还没有涵盖异常处理,因此这是教授想要的做法。我应该澄清,我不仅仅是在寻找别人为我编写代码。这种知识确实很有用,可以让我完成实验的其他部分,所以谢谢! - Christian Silva
@ChristianSilva 那就解释了。不用担心代码,你显然已经完成了其他所有工作,这只是缺失的最后一块拼图。 - biziclop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接