Java,查找两个数组的交集

2022-09-01 09:16:54

我已经阅读了其他一些堆栈溢出线程:

查找 java 中两个多集的交集

如何将两个数组之间的交集作为新数组?

public static int[] intersection (int [] x, int numELementsInX, int [] y, int numElementsInY) {

我正在尝试检查两个数组以及它们的元素数量(numElementsInX和numElementsInY),并返回一个包含数组x和y的通用值的新数组。

Example,if x is{1,3,5,7,9}and y is{9,3,9,4} then
intersection(x, 5, y, 4} should return {3, 9} or {9, 3}

我已经阅读了我需要使用LCS算法。任何人都可以给我举个例子来说明如何做到这一点吗?数组和数组中的值都初始化并在另一个方法中生成,然后传递到交集。

任何帮助/澄清是值得赞赏的。

编辑代码

for (int i=0; i<numElementsInX; i++){
    for (int j=0; j<numElementsInY; j++){
        if (x[j]==x[i]) { //how to push to new array?; 
        }
        else{
        }
    }
}

答案 1

最简单的解决方案是使用集合,只要您不关心结果中的元素将具有不同的顺序,并且将删除重复项。输入数组 和 是给定数组的子数组,对应于要处理的元素数:array1array2Integer[]int[]

Set<Integer> s1 = new HashSet<Integer>(Arrays.asList(array1));
Set<Integer> s2 = new HashSet<Integer>(Arrays.asList(array2));
s1.retainAll(s2);

Integer[] result = s1.toArray(new Integer[s1.size()]);

上面将返回一个,如果需要,可以简单地复制并将其内容转换为.Integer[]int[]


答案 2

如果你对很好,那么我能想到的最简单的解决方案就是使用流和过滤器。实现方式如下:

public static int[] intersection(int[] a, int[] b) {
    return Arrays.stream(a)
                 .distinct()
                 .filter(x -> Arrays.stream(b).anyMatch(y -> y == x))
                 .toArray();
}