2016-03-17 73 views
3

使用IntStream求和二維數組中的一系列元素的語法是什麼?IntStream求和二維數組

對於一維數組,我使用的語法如下:

int totalElementsInArray = 0; 

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

因此,例如,說我有一個二維數組:

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

使用IntStream用於加列時,什麼是語法第0行0-16?

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

換句話說:

  • 變換dataStream<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();