2015-07-26 2 views
0

Я пытаюсь написать код, который находит среднее значение входов 2D массива:Double Array: Из Пределов

Это то, что я написал:

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} 
    }; 

это дает мне следующую ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at AverageLength.main(AverageLength.java:18)

Как я могу исправить эту проблему?

ответ

1

изменение

foobar[0].length 

в

foobar[i].length 

, когда ваши суб длины массивов различны, вы должны получить соответствующую длину

, например

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

в этом случае

foobar[0].length является 4 .so, когда петля через 3 подобласти {8, 3} и при попытке получить доступ к 2-й индекс [3-й элемент] вы получите ошибку

ArrayIndexOutOfBoundsException: 2 

, потому что нет второго индекса.

а также в 2-й подкатегории {3, 3, 5, 7, 8, 4}, значение 8 и 4 не будет печатать, потому что вы выполняете цикл 4 раза.

+1

Спасибо за помощь :) –

0

Когда вы проверяете свой seccond для длины массива, вы должны использовать i не 0, потому что если вы используете 0, вы всегда будете иметь длину только первого массива.

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

@June Спасибо за помощь :) –

0

С помощью foobar[0].length вы используете длину первого внутреннего массива для каждый внутренний массив. Вместо этого используйте foobar[i].length, который рассчитает длину текущей длины.

Кстати: Вычислительные средние массивов int могут быть выполнены java-internal с Java8.Пример того, как использовать Java8 в потокового 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())
Смежные вопросы