【问题标题】:Java Magic Square - Sum Column and Sum Row ErrorsJava Magic Square - 求和列和求和行错误
【发布时间】:2015-11-25 05:52:15
【问题描述】:

我被分配了一项学校作业,以制作并检查用户在 N*N 矩阵中生成的二维数组中的“魔方”。

到目前为止,我已经正确编写了大部分代码(我已经单独测试了每个方法)。但是,我无法纠正在我的“sumColumn”和“sumRow”方法中不断出现的两个最终错误。这是我前面提到的两种方法的代码:

public static int sumColumn(int[][] square, int columnNumber)
{
    int sum = 0 ;
    for (int j = 0; j < square.length ; j++)
    {
        for (int i = 0; i < square.length; i++)
        {
            sum = sum + square[i][j] ;
        }
    }                        
    return sum ;
}

public static int sumRow(int[][] square, int rowNumber)
{
    int sum = 0 ;
    for (int i = 0; i < square.length; i++)
    {
        for (int j = 0; j < square.length; j++)
        {
            sum = sum + square[i][j] ;
        }
    }
    return sum ;
}

这是输出以及从 main 方法调用时出现的错误:

Please enter a value for N:
1
Please enter 1 numbers: 
1
This is the square you input:
+-+
|1|
+-+
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
The method sumColumn(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.main(MagicSquares.java:167)

对“sumRow”和“sumColumn”的一些摆弄会产生另一个错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
rowNumber cannot be resolved to a variable at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)
colNumber cannot be resolved to a variable at squares.MagicSquares.main(MagicSquares.java:167)

在解决此问题方面的任何帮助将不胜感激!谢谢!

PS:我上个月才开始编程,请善待:3

编辑:这里是检查每行、每列以及主对角线和次对角线是否相等以制作一个魔方的方法。

boolean status = true ;
    int sum = sumDiagonal(square) ;
    if (sumSecondaryDiagonal(square) != sum)
    {
        status = false ;
    }
    else
    {
        for (int row = 0; (row < square.length) && status; row ++)
        {
            if (sum != sumRow(square, square.length))
            {
                status = false ;
            }
        }
        for (int col = 0; (col < square.length) && status; col ++)
        {
            if (sum != sumColumn(square, square.length))
            {
                status = false ;
            }
        } 
    }
    return status;

【问题讨论】:

    标签: java arrays methods compiler-errors magic-square


    【解决方案1】:

    您的 sumColumn 方法需要两个参数:

    1. int[][] square
    2. int columnNumber

    在您的 main 方法中,您似乎只提供了一个参数 int[][],而您忘记将 columnNumber 作为第二个参数。

    同样适用于sumRow 方法。

    我根据您发布的错误消息做出了上述发现:

    The method sumRow(int[][], int) in the type MagicSquares is not applicable for the arguments (int[][]) at squares.MagicSquares.validMagicSquare(MagicSquares.java:105)

    它说,在您的 MagicSquares.java 文件的第 105 行中,您调用了sumRow 方法。在第 105 行,它进一步表明您实现的方法 (The method sumRow(int[][], int) in the type MagicSquares) 不能使用/不适用于带有参数 (int[][]) 的调用。

    【讨论】:

    • 感谢您的快速回复!是的,我不确定如何将“int rowNumber”和“int columnNumber”包含在它们各自的方法中。根据我的分配规则,我无法摆脱这些变量,也无法以任何方式更改 main 方法):
    • 我并不是建议你摆脱它们。相反,在你的 main 方法中,你应该包含这个参数,例如: int x = sumRow(square, 5)
    • 不客气。现在让一切都完成,将答案标记为“已接受”:)
    【解决方案2】:

    您显示的代码没有语法错误。

    但你的例外:

    MagicSquares 类型中的方法 sumRow(int[][], int) 不适用于 squares.MagicSquares 的 参数 (int[][]) .validMagicSquare(MagicSquares.java:105)

    在调用sumColumnsumRow 时,您没有正确调用它们:

    int[][] matrix = // your matrix;
    sumRow(matrix);     // bad call
    sumRow(matrix, 1);  // good call!!!!
    

    但实际上,如果您检查不使用 columnNumberrowNumber 的方法,那么如果您想对所有列/行求和,请重新声明您的方法,因为现在是这样写的:

    public static int sumAllColumns(int[][] square)
    public static int sumAllRows(int[][] square)
    

    并确保第二个循环遍历列!!!

    for (int j = 0; j < square[0].length; j++)
    

    我不得更改任何方法的标题。

    因此,只需使用已经存在的方法,但请确保使用 columnNumberrowNumber 变量。如果方法描述正确,您只需对给定的行/列求和,因此不需要嵌套循环。

    public static int sumColumn(int[][] square, int columnNumber) {
        int sum = 0 ;
        for (int i = 0; i < square.length; i++)
            sum = sum + square[columnNumber][i] ;
        return sum ; 
    }
    
    public static int sumRow(int[][] square, int rowNumber)
    {
        int sum = 0 ;
        for (int i = 0; i < square[0].length; i++)
            sum = sum + square[i][rowNumber] ;
        return sum ;
    }
    

    Check here a working DEMO.

    添加

    安全检查:只要您可以提供任何columnNumberrowNumber,这些方法都可以抛出IndexOutOfBounds 异常。 解决方案
    为避免这种情况,请检查给定的索引是否在数组中。

    人性化:要对第一行或第一列求和,您必须给出 0 值。因此,为了让用户以 human 的方式引用行和列(如果是第一个,则为第 1 列) 解决方案
    为了避免在您的方法和检查中使用给定的行/列 - 1:

    public static int sumColumn(int[][] square, int columnNumber) {
        // humanize
        columnNumber = columnNumber - 1;
        // safe check
        if ((columnNumber) > square.length) 
            return 0;
    
        int sum = 0 ;
        for (int i = 0; i < square.length; i++)
            sum = sum + square[columnNumber][i] ;
        return sum ; 
    }
    
    public static int sumRow(int[][] square, int rowNumber)
    {
        // humanize
        rowNumber = rowNumber - 1;
        // safe check
        if ((rowNumber) > square[0].length) 
            return 0;
    
        int sum = 0 ;
        for (int i = 0; i < square[0].length; i++)
            sum = sum + square[i][rowNumber] ;
        return sum ;
    }
    

    【讨论】:

    • 感谢您的快速回复 :) 是的,去掉 'int columnNumber' 和 'int rowNumber' 可以解决问题。不幸的是,根据我的作业规则,我无法更改任何方法的标题(包括 main 方法)grrr 我必须在我的方法中使用 int columnNumber 和 rowNumber):我正在努力将这两个变量合并到它们各自的方法中,因为它们看起来“多余”。
    • 不错的代码!但我的矩阵范围可以从 2*2 矩阵到无限数@_@。参数必须采用这样的方式,它可以单独汇总任何给定数量的 N 的行。
    • 这就是我的代码所做的,如果不是,请check the demo.... 您可以在其中插入任何需要与列求和的二维数组,我的代码未检查的是有效值rowNumbercolumnNumber 所以如果你插入一个 5x5 数组并尝试对第 6 列求和将抛出 IOOBException
    • 嗯,我的代码不同。我已经编辑了我的问题,以向您展示我的意思。我不确定如何用语言准确地解释它。 >
    • 您查看了演示吗?你知道如何获取方法返回的值吗?为什么你说它与我的代码不同 ???您的代码必须有 2 种方法来对给定的列或行求和...这就是我最后的 2 种方法所做的...如果您不理解某些内容,请说出来...但是 这不起作用in my code is different 没有给我们任何关于您的问题的线索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多