Напишите функцию с именем arraySum, которая возвращает сумму (как целое число) всех значений в двумерном массиве значений int (Java) - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь суммировать все значения int массива 2D. Я назвал это массивом. моя функция тогда называется arraySum. Если arraySum имеет значение null, я возвращаю 0. В противном случае он проходит два цикла for, суммируя значения этих массивов.

int i = 0;
int j = 0;
static int sum = 0;
int[][] array = new int[i][j];
static int arraySum(int[][] array) { 
    if (array == null) {  // test if the incoming param is null
        return 0;
    } else { 
        for (int i = 0; i < array.length; i++) {  // length of the outer array
            for (int j = 0; j < array[i].length; j++) {  // length of the inner array
                sum += array[i][j];
            }
        }
        return sum;  // moved out of the loop
    }
} 

мое сообщение об ошибке:

java.lang.AssertionError: Incorrect result:  expected [-217085] but found [-308126] 


Ответы [ 3 ]

1 голос
/ 12 февраля 2020
  1. Исправление сигнатуры метода - это первый шаг.
  2. Затем вам нужно будет исправить проверку нуля.
  3. Затем ваши циклы должны проверить размер внутреннего и внешние массивы.
  4. Перемещение оператора возврата.

Вот фиксированный код:

static int arraySum(int[][] array) {  // fix the signature
    if (array == null) {  // test if the incoming param is null
        return 0;
    } else { 
        int sum = 0;  // you need this in the scope of the method - it will be returned at the end
        for (int i = 0; i < array.length; i++) {  // length of the outer array
            for (int j = 0; j < array[i].length; j++) {  // length of the inner array
                sum += array[i][j];
            }
        }
        return sum;  // moved out of the loop
    }
}

Редактировать: Я сосредоточился на только метод сейчас - как вы его называете, зависит от вас. Обратите внимание, что метод не повлияет на внешнюю переменную sum. Он вернет сумму, и вызывающий объект сохранит это значение где-нибудь.

0 голосов
/ 12 февраля 2020

Потоки могут делать это тоже:

//Create 2D array
int[][] array = {{1,2,3},{4,5},{6}}; 

//Sum all elements of array
int sum = Stream.of(array).flatMapToInt(IntStream::of).sum(); 

System.out.println(sum);

Выделение кода суммирования:


Stream.of(array)

Превращает двумерный массив типа int[][] в Stream<int[]> , Отсюда нам нужно go на один уровень глубже, чтобы обработать каждый дочерний массив в 2D-массиве, поскольку поток передает только первое измерение.

Таким образом, на этом этапе у нас будет поток, содержащий:

  • массив int [], содержащий {1,2,3}
  • массив int [], содержащий {4,5}
  • массив int [], содержащий {6}

.flatMapToInt(IntStream::of)

Пока у нас есть Поток int[], все еще двумерный. Плоская карта объединяет структуру в единый поток целых чисел.

flatMapToInt() расширяет каждый int[] элемент потока в одно или несколько значений int. IntStream.of() принимает массив int[] и превращает его в поток int. Объединение этих двух значений дает один поток int значений.

После сглаживания у нас будет поток int:

{1,2,3,4,5,6 }


.sum()

Теперь у нас есть IntStream со всеми элементами, развернутыми из исходного двумерного массива, просто получается сумма всех значений.


Теперь отказ от ответственности - если вы новичок в Java и изучаете массивы, это может быть слишком сложным. Я бы рекомендовал узнать о вложенности циклов for и перебирать массивы. Но также полезно знать, когда API может сделать большую часть работы за вас.

0 голосов
/ 12 февраля 2020

Избегайте использования примитива для оператора. Смотрите следующее:

    static int arraySum(int[][] array) {
        int sum = 0;
        if (array == null) return 0;

        for(int[] row: array){
            for(int col : row) {
                sum += col;
            }
        }
        return sum;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...