【问题标题】:Error: int cannot be converted to int[][]错误:int 无法转换为 int[][]
【发布时间】:2021-08-21 09:14:24
【问题描述】:

我在 HackerRank (Diagonal Difference) 上做这个问题,我目前面临一个问题。

这里是问题的链接:
https://www.hackerrank.com/challenges/diagonal-difference/problem

问题是我经常收到错误消息:int cannot be converted to int[][]
我尝试初始化变量 j 但这也没有解决问题。

这是我的代码:

import java.util.*;
public class DiagonalDifference {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int a[][] = new int[3][3]; //Initializing the array of 3X3

        //Assuming i: rows and j: columns
        int i, j, leftToRight = 0, rightToLeft = 0;
        for (i = 0; i < 3; i++) {
            for (j = 0; j < 3; j++) {
                a[i][j] = sc.nextInt();
            }
        }
        diagonalDiff(a[i][j], leftToRight, rightToLeft);
    }

    static int diagonalDiff(int a[][], int leftToRight, int rightToLeft) {
        leftToRight = a[0][0] + a[1][1] + a[2][2];
        rightToLeft = a[0][2] + a[1][1] + a[2][0];

        int diff = Math.abs(leftToRight - rightToLeft);
        return diff;
    }
}

如果有人能向我解释我做错了什么,我将不胜感激。 谢谢。

【问题讨论】:

  • 您的解决方案仅适用于大小为 3x3 的数组,在问题中它们可以是可变大小的。

标签: java arrays methods integer


【解决方案1】:

diagonalDiff 方法的第一个参数是一个数组(二维)。但是你在调用它时传递了一个int。 (a[i][j] 将是 int

尝试这样称呼它:

diagonalDiff(a, leftToRight, rightToLeft);

一旦你这样做了,你可能也不需要在循环之前初始化j


其他一些小建议/挑剔(与这个问题无关,但会帮助 OP 学习):

  • 您可能不想将 leftToRightrightToLeft 传递给 diagonalDiff,因为您正在覆盖传递的值并从头开始计算它们。
  • 您可以将循环编写为for(int i=0; i&lt;3; i++),而不是在循环之外声明int。这是一个更普遍遵循的约定。
  • 最好将diagonalDiff 声明为private,因为它不会在此类之外使用。
  • 看起来您正在调用diagonalDiff,但忽略了返回的值。您可能想要使用该值。
  • 您可以直接返回计算出的diff,而不是将其存储在变量中。

【讨论】:

  • 很好的建议!我一定会注意他们的。非常感谢。关于您提出的第二点,我实际上并没有首先初始化循环外的变量。只是因为“变量j尚未初始化”错误,我不得不这样做。
【解决方案2】:

您的方法对角Diff 接受一个二维整数数组,但您传递给它的是a[i][j],它是该数组的一个元素,它只是一个整数。

【讨论】:

    【解决方案3】:

    diagonalDiff 的第一个参数必须是int[][] 类型,而您将其传递给a[i][j],它是位于i, j 位置的变量a 中的整数。因此,正如错误所说,您正在为“整数数组数组”类型的参数提供一个整数作为参数,这当然是行不通的。

    如果您想将矩阵的引用传递给您的方法,您可以将调用diagonalDiff 的方式更改为:

    diagonalDiff(a, leftToRight, rightToLeft)
    

    【讨论】:

    • 好的,我现在意识到了。所以每当我传递参数时,我都不应该传递变量。对吗?
    • @BlackWizard 这一切都取决于您需要传递什么值。如果您的方法需要一个整数,您仍然可以使用a[i][j]。例如,对该方法的有效调用将是diagonalDiff(a, a[i][j], rightToLeft)。在这里,您将传递对矩阵a 的引用、a 中位置i, j 的整数,然后是rightToLeft。这是因为 a[i][j] 解析为整数。
    【解决方案4】:

    如果我们想将数组传递给另一个方法,我们使用数组地址。数组地址也称为数组引用。 例如:-

    int a[][] = new int[3][3];
    

    在这个数组中的数组地址是a。

    所以 a[i][j] 表示您安装到 (i,j) 的某些元素。 所以在你的代码中,

     diagonalDiff(a[i][j], leftToRight, rightToLeft); 
    

    a[i][j] 参数没有传递任何数组。但是你的参数是二维类型数组。所以编译器说 int 不能转换为 int[][]。 所以代码应该是,

     diagonalDiff(a[i][j], leftToRight, rightToLeft);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2021-09-23
      相关资源
      最近更新 更多