有没有办法在多个列表中找到共同元素?

rav*_*rab 11 java arrays collections colt guava

我有一个整数数组列表.我需要找到它们之间的共同元素.我能想到的是两个列表Common元素中列出的内容的扩展

Example would be 
[1,3,5],
[1,6,7,9,3],
[1,3,10,11]

should result in [1,3]
Run Code Online (Sandbox Code Playgroud)

数组中也没有重复项.

有没有直接的方法来做到这一点?

Ami*_*ost 16

您可以将列表转换为集合,然后使用Set.retainAll方法在不同集合之间进行交集.一旦与所有集相交,就会留下公共元素,并且可以将结果集转换回列表.

  • 它仍然符合您的要求 - 您可以将每个列表转换为Set(HashSet可以将Collection作为构造函数参数),执行交集,并将相交的集转换回列表.该解决方案是O(n),而对每个列表进行排序和比较是O(n*log(n)),并且将每个项目与其他项目进行比较是O(n ^ 2). (2认同)
  • @AmirKost转换为`Set`(不是`LinkedHashSet`)将失去列表的排序. (2认同)

Ous*_*ami 10

您可以使用Guava提供的Set的交集方法,这是一个小例子:

public <T> Set<T> intersection(List<T>... list) {
    Set<T> result = Sets.newHashSet(list[0]);
    for (List<T> numbers : list) {
        result = Sets.intersection(result, Sets.newHashSet(numbers));
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助你


Roh*_*ain 6

与Java 8

ArrayList retain = list1.stream()
                     .filter(list2::contains).filter(list3::contains).collect(toList())
Run Code Online (Sandbox Code Playgroud)


Han*_*zun 5

我们可以使用retainAll集合的方法.我commons用第一个数组列表初始化了我的arraylist,并为每个剩下的arraylists调用了它.

    List<List<Integer>> lists = new ArrayList<List<Integer>>();
    lists.add(new ArrayList<Integer>(Arrays.asList(1, 3, 5)));
    lists.add(new ArrayList<Integer>(Arrays.asList(1, 6, 7, 9, 3)));
    lists.add(new ArrayList<Integer>(Arrays.asList(1, 3, 10, 11)));

    List<Integer> commons = new ArrayList<Integer>();
    commons.addAll(lists.get(1));
    for (ListIterator<List<Integer>> iter = lists.listIterator(1); iter.hasNext(); ) {
        commons.retainAll(iter.next());
    }

    System.out.println(commons);
    System.out.println(lists.get(1));
Run Code Online (Sandbox Code Playgroud)

  • 为什么从索引 1 开始?难道我们不应该从0开始吗? (2认同)