两个arraylist Java之间的交集

时间:2018-06-20 20:18:08

标签: java arraylist

我想找到两个byte []格式的arraylist之间的交集,并返回公共索引。我的代码如下,并且可以正常工作:

ArrayList<Integer> intersect = new ArrayList<Integer>();
for(int j = 0; j < A.size(); j++)
    {
        byte [] t = A.get(j); 
        for (int j1 = 0; j1 < B.size(); j1++)
        {
            byte[] t1 = B.get(j1);
            if (Arrays.equals(t, t1))
            {
                intersect.add(j);
                break;
            }
        }
    }

但是,正如您所看到的,我必须使用两个for循环。有没有不用for循环的方法吗?我尝试使用“ retainAll” ,但是由于某种原因,它一直给我一个空数组。可能是什么原因?

3 个答案:

答案 0 :(得分:0)

如果您只是不想使用循环,可以尝试Java 8流,因为您尚未共享完整的代码,而我没有尝试过。

List<T> intersect = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());

答案 1 :(得分:0)

我认为对于T而言,您对brutforce的解决方案还不错。这只是它的一个小重构。是的,对于特定的T(例如int),您可以使用特殊的结构,但是在一般情况下,我认为这是无法实现的。

public static <T> List<Integer> intersect(List<T> A, List<T> B, BiPredicate<T, T> isEqual) {
    List<Integer> intersect = new LinkedList<>();
    int i = -1;

    for (T a : A) {
        i++;

        if (B.stream().anyMatch(b -> isEqual.test(a, b)))
            intersect.add(i);
    }

    return intersect;
}

客户端代码如下:

List<byte[]> a = Collections.emptyList();
List<byte[]> b = Collections.emptyList();
List<Integer> intersect = intersect(a, b, Arrays::equals);

答案 2 :(得分:-1)

这可能有帮助:

public <T> List<T> intersection(List<T> list1, List<T> list2) {
        List<T> list = new ArrayList<T>();

        for (T t : list1) {
            if(list2.contains(t)) {
                list.add(t);
            }
        }
        return list;
    }

参考: Intersection and union of ArrayLists in Java

相关问题