所以我有方法
public ArrayList<String> intersection( ArrayList<String> A1, ArrayList<String> A2)
我不知道我的帮助方法是什么样的,返回一个ArrayList,其中包含A1和A2中的元素,*按照它们在A1 *中出现的顺序,并且*保持A1和A2不变*
这是我主要编写的测试内容。
ArrayList A1 = new ArrayList();
ArrayList A2 = new ArrayList();
A1.add("a"); A1.add("b"); A1.add("c");
A2.add("b"); A2.add("c"); A2.add("d"); A2.add("e");
ArrayList intersect = Practice.intersection(A1,A2);
System.out.println(A1 + " intersect " + A2 + " = " + intersect);
我想要的输出示例是 [a,b,c]与[b,c,d,e] = [b,c]
相交答案 0 :(得分:0)
如果我理解正确,您需要为intersection
方法实施递归。基本上,您希望迭代a1
并检查每个元素是否包含在a2
中。
您可以使用递归迭代a1
:在每个步骤中,您删除列表的head
并检查它是否包含在a2
中,然后addAll
来自tail
与a2
交集的元素。
看一下代码:它应该是不言自明的。
public static void main(String[] args) {
ArrayList<String> a1 = new ArrayList<String>();
ArrayList<String> a2 = new ArrayList<String>();
a1.add("a"); a1.add("b"); a1.add("c");
a2.add("b"); a2.add("c"); a2.add("d"); a2.add("e");
ArrayList<String> intersect = intersection(a1, a2);
System.out.println(a1 + " intersect " + a2 + " = " + intersect);
}
static <A> ArrayList<A> intersection(ArrayList<A> a1, ArrayList<A> a2){
if(a1.isEmpty())
return a1;
else {
ArrayList<A> result = new ArrayList<A>();
A head = a1.get(0);
if (a2.contains(head))
result.add(head);
ArrayList<A> tail = new ArrayList<>();
tail.addAll(a1.subList(1, a1.size()));
result.addAll(intersection(tail, a2));
return result;
}
}
Java的可变列表存在一个小缺陷:请注意,只需一个简单的操作即可获得head
和tail
:a1.remove(0)
。但是,如果您没有先制作防御性副本,那么您将修改原始a1
,这绝对不是您想要的。