两个arraylist Java的交集
我想在两个字节[]格式的arraylist之间找到一个交集,并返回公共索引。我的代码如下,并且工作正常:两个arraylist Java的交集,java,arraylist,Java,Arraylist,我想在两个字节[]格式的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++)
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循环就完成?我曾尝试使用retainal,但由于某种原因,它一直给我一个空数组。可能的原因是什么?如果您只是不想使用for循环,您可以尝试Java 8流,因为您没有共享我没有尝试过的完整代码
List<T> intersect = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());
这可能有助于:
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;
}
参考:
我认为你用暴力解决问题的方法并不坏。这是它的一个小重构。是的,对于特定的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);
我曾尝试使用retainal,但由于某种原因,它一直给我一个空数组。可能的原因是什么?因为数组的equals实现检查的是标识,而不是内容。使用其他集合类型可能会提供一些有用的信息以获得相同的行为。@Shahnewaz鉴于您需要控制相等性检查,您使用的代码可能是在没有其他数据结构的情况下所能做到的最好的。另外,如果您试图保留数组在列表中的位置,而不是数组本身,那么retainsAll将永远不会给出您想要的结果。。。不是真的。概念是相同的,但接受的答案不起作用。因此,对于我的列表,它应该是list intersect=A.stream.filterB::contains.collectCollectors.toList;对吗?@SeanBright如果OP没有要求它,它到底为什么应该为=数组工作@SeanBright你是对的。。。OP的问题很糟糕!你这个卑鄙的朋克;