使用Java8流只保留跨多个数组的唯一值

使用Java8流只保留跨多个数组的唯一值,java,arrays,java-8,java-stream,Java,Arrays,Java 8,Java Stream,在使用流合并两个数组之后,我只想保留它们的唯一值。我要找的不是distinct()函数: 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} 使用streams是否有一种简单快捷的方法来实现这一点?您可以这样做: int[

在使用流合并两个数组之后,我只想保留它们的唯一值。我要找的不是
distinct()
函数:

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}

使用streams是否有一种简单快捷的方法来实现这一点?

您可以这样做:

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()
    ));
这首先为所有元素创建一个频率映射,然后过滤掉多次出现的元素。

您可以这样做:

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()
    ));

这首先为所有元素创建一个频率映射,然后过滤掉多次出现的元素。

值在任何数组中是否可以出现多次?如果不是,则解决方案类似于以下伪代码:
concat(a,b).group().filter(count==1)
值在任何数组中是否可以出现多次?若并没有,那个么解决方案就像这个伪代码:
concat(a,b).group().filter(count==1)
谢谢。这很有帮助。我想我可以从这里开始。谢谢。这很有帮助。我想我可以从这里开始。