2016-09-18 1 views
1

ストリームを使用して2つの配列をマージした後、その値を保持したいとします。それは私が探している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}を与えますが、私は{1, 2, 4, 5}

するcを必要とし、この使用してストリームを達成するための簡単かつ迅速な方法はありますか?

+1

いずれの配列でも値が複数回現れることはありますか?そうでなければ、solutionはこの疑似コードに似ています: '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

ありがとう。それは大いに役立ちます。私はここから進めることができると思う。 –

関連する問題