我想找到两个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” ,但是由于某种原因,它一直给我一个空数组。可能是什么原因?
答案 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;
}