2016-03-17 3 views
3

Каков синтаксис использования IntStream для суммирования диапазона элементов в 2D-массиве?IntStream для суммирования 2D-массива

Для 1D массив, я использую следующий синтаксис:

int totalElementsInArray = 0; 

totalElementsInarray = IntStream.of(myArray).sum(); 

Так, например, сказать, у меня есть 2D массив:

int[][] my2DArray = new int[17][4]; 

Что такое синтаксис при использовании IntStream для суммирования столбцов 0-16 в строке 0?

int totalElementsInArray = 0; 

totalElementsInarray = IntStream.of(my2DArray[0 through 16][0]).sum(); 

ответ

2

Вы можете сделать это, как этот

IntStream.range(0, 17) 
     .map(i -> my2DArray[i][0]) 
     .sum(); 
6

Вам просто нужно для отображения каждого вложенного массива на int, взяв первый элемент:

import java.util.*; 
import java.util.stream.*; 

class Test { 
    public static void main(String args[]) { 
     int[][] data = { 
      { 1, 2, 3 }, 
      { 4, 5, 6 } 
     }; 

     int sum = Arrays.stream(data) 
         .mapToInt(arr -> arr[0]) 
         .sum(); 
     System.out.println(sum); // 5, i.e. data[0][0] + data[1][0] 
    } 
} 

Другими словами:

  • Transform data до Stream<int[]> (т. поток простых int массивов)
  • Карта каждый массив первый элемент, так что мы в конечном итоге с IntStream
  • Сумма этого потока

Я предпочитаю этот подход над подходами с использованием range, так как кажется нет необходимости рассматривать индексы подматриц. Например, если у вас только есть Iterable<int[]> arrays, вы все равно можете использовать StreamSupport.stream(arrays.spliterator(), false).mapToInt(arr -> arr[0]).sum(), тогда как для подхода диапазона потребуется многократное повторение.

+2

Плюс один для скорости вы управляемый чтобы превратить блестящий ответ на другой вопрос на блестящий ответ на этот вопрос! 'Iterable' не имеет метода' stream', хотя ... –

+1

@PaulBoddington: Вы правы; Я слишком много думал о LINQ. Редактирование ... –

4

Один из способов сделать это было бы создать IntStream над индексами

IntStream.range(0, my2DArray.length).map(i -> my2DArray[i][0]).sum(); 

или только сохранить первую строку результата Arrays.stream:

Arrays.stream(my2DArray).mapToInt(a -> a[0]).sum(); 
Смежные вопросы