【问题标题】:Double Array: Out of Bounds双数组:越界
【发布时间】:2023-03-17 18:16:01
【问题描述】:

我正在尝试编写一个代码来查找二维数组的输入平均值:

这是我写的:

public class AverageLength
{
  public static void main(String[] args)
  {
    int sum = 0;
    int w = 0;
    int[][] foobar = new int[][]
    {
      {0, 5, 7},
      {3, 2, 4},
      {8, 7, 3},
      {1, 5, 3}
    };
    for (int i = 0; i < foobar.length; i++)
    {
      for (int j = 0; j <foobar[0].length; j++)
      {
        System.out.println(foobar[i][j]);
        sum = sum + foobar[i][j];
        w++;
      }
    } System.out.println("Average = " + sum/w);
  }
}

但是,如果我更改数组长度并尝试以下操作:

    int[][] foobar = new int[][]
    {
      {0, 5, 7, 3},
      {3, 3, 5, 7, 8, 4},
      {8, 3},
      {1, 5, 1, 2, 3}
    };

它给了我以下错误:

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 2 在 AverageLength.main(AverageLength.java:18)

我该如何解决这个问题?

【问题讨论】:

    标签: java


    【解决方案1】:

    改变

    foobar[0].length
    

    foobar[i].length
    

    当你的子数组长度不同时,你应该得到相应的长度

    例如

    {0, 5, 7, 3},
    {3, 3, 5, 7, 8, 4},
    {8, 3},
    

    在这种情况下

    foobar[0].length 是 4 .so 当你循环遍历第三个子数组 {8, 3} 当您尝试访问第二个索引 [3rd element ] 时,您会收到错误

    ArrayIndexOutOfBoundsException: 2 
    

    因为没有第二个索引。

    并且在第二个子数组{3, 3, 5, 7, 8, 4}, 中,值 8 和 4 将不会打印,因为您循环了 4 次。

    【讨论】:

      【解决方案2】:

      当你检查你的第二个数组长度时,你应该使用 i 而不是 0,因为如果你使用 0,你总是会得到第一个数组的长度。

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

      【讨论】:

      • @June 谢谢你的帮助:)
      【解决方案3】:

      通过使用foobar[0].length,您将第一个内部数组的长度用于每个内部数组。请改用foobar[i].length,它将计算当前数组的长度。

      顺便说一句:从 Java8 开始,计算 int 数组的平均值可以在 java 内部完成。如何使用 Java8 的 streaming API 解决此任务的示例:

      import java.util.Arrays;
      
      public class AverageLength
      {
        public static void main(String[] args)
        {
          int[][] foobar = new int[][]
          {
            {0, 5, 7},
            {3, 2, 4},
            {8, 7, 3},
            {1, 5, 3}
          };
      
          System.out.print("Average = ");
          System.out.println(
      
                  // convert 2D array to stream of arrays
                  Arrays.stream(foobar)
      
                  // flatten 2D array to 1D array
                  .flatMapToInt(Arrays::stream)
      
                  // let java calculate the average
                  .average()
      
                  // get result
                  .getAsDouble());
        }
      }
      

      好处:

      • 代码更容易理解
      • 您的程序可能要快得多
      • 可以轻松更改代码以在多个线程中运行(使用.parallel()

      【讨论】:

        猜你喜欢
        • 2012-10-28
        • 1970-01-01
        • 2019-05-03
        • 2011-06-23
        • 1970-01-01
        • 2019-05-10
        • 2014-11-16
        • 2012-11-04
        • 2013-07-27
        相关资源
        最近更新 更多