2016-09-18 42 views
1

我想在使用流合併它們之後僅保留兩個數組的唯一值。這並不是說我要找的distinct()功能:僅保留使用Java 8流的幾個陣列中唯一的值

int[] a = { 1, 2, 3 }; 
int[] b = { 3, 4, 5 }; 
int[] c = IntStream.concat(Arrays.stream(a), Arrays.stream(b)).distinct().toArray(); 

給我c = {1, 2, 3, 4, 5},但我需要c{1, 2, 4, 5}

有一個簡單,快捷的方式實現這一目標使用流?

+1

在任何數組中,值是否可以多次出現?如果不是,那麼解決方案就像這樣的僞代碼:'concat(a,b).group()。filter(count == 1)' – Andreas

回答

4

你可以這樣做:

int[] a = { 1, 2, 3 }; 
int[] b = { 3, 4, 5 }; 
int[] c = IntStream.concat(Arrays.stream(a), Arrays.stream(b)) 
    .boxed() 
    .collect(Collectors.collectingAndThen(
     Collectors.groupingBy(Function.identity(), Collectors.counting()), // Freq map 
     m -> m.entrySet().stream() 
      .filter(e -> e.getValue() == 1) // Filter duplicates 
      .mapToInt(e -> e.getKey()) 
      .toArray() 
    )); 

這首先爲所有元素的頻率圖,然後篩選出發生不止一次的元素。

+0

謝謝。這有很大幫助。我想我可以從這裏出發。 –