所以结构是{{Dog,Cat,Human},{Human,Dog,Whale,rabbit,Cow},{Monkey,Human,Dog}}.
输出应该是:Dog,Human.
我必须在较大的List中找到List元素的交集.以前,我已经看到了找到相互交叉的代码ArrayLists,但不知道我怎么能在同一个ArrayList(两个以上)内完成.
对于单独ArrayLists的代码,如下所示.但是如何让它更适合多个ArrayLists内部ArrayList?我在接受采访时被问到这个问题.为单独的列表工作,但不能用它来粉笔ArrayList.
面试官明确规定只与字符串的工作,所以我修改了泛型类型令牌从{<T>}以{<String>}澄清之后.
public class Test {
public <String> List<String> intersection(List<String> list1, List<String> list2) {
List<String> list = new ArrayList<>();
for (String t: list1) {
if(list2.contains(t)) {
list.add(t);
}
}
return list;
}
public static void main(String[] args) throws Exception {
List<String> list1 = new ArrayList<String>(Arrays.asList("Dog", "Cat", "Human"));
List<String> list2 = new ArrayList<String>(Arrays.asList("Human", "Dog", "Whale", "rabbit", "Cow"));
System.out.println(new Test().intersection(list1, list2));
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生两个独立的正确输出ArrayLists.但是,如果稍微修改输入,例如,交集方法将返回a,a,a输入a,a,a,a,a,但它将a,a为输入a,a和a,a,a.逻辑假设是它应该总是返回,a,a而不管参数的顺序如何.
关于如何解决这个问题的任何建议,无论输入顺序如何?我怎么能在一个更大的列表中找到几个列表(两个以上)的交集?
交集是关联的,您可以实现两个列表的交集,然后将相同的算法重复应用于其余列表.
Java提供了一种通过retainAll操作进行交集的内置方法:
List<String> a = ...
List<String> b = ...
List<String> c = ...
List<String> intersection = new ArrayList<>(a);
intersection.retainAll(b);
intersection.retainAll(c);
Run Code Online (Sandbox Code Playgroud)