Java中的两个List <string>的高效交集?</string>

时间:2010-03-08 11:15:40

标签: java list intersection

问题很简单:

我有两个List

List<String> columnsOld = DBUtils.GetColumns(db, TableName);
List<String> columnsNew = DBUtils.GetColumns(db, TableName);

我需要得到这些的交集。有没有快速实现这一目标的方法?

8 个答案:

答案 0 :(得分:107)

您可以使用retainAll方法:

columnsOld.retainAll (columnsNew);

答案 1 :(得分:18)

由于retainAll不会触及参数集合,因此速度会更快:

List<String> columnsOld = DBUtils.GetColumns(db, TableName); 
List<String> columnsNew = DBUtils.GetColumns(db, TableName); 

for(int i = columnsNew.size() - 1; i > -1; --i){
    String str = columnsNew.get(i);
    if(!columnsOld.remove(str))
        columnsNew.remove(str);
}

交集将是columnsNew中剩余的值。删除已经比较的值fom columnsOld将减少所需的比较次数。

答案 2 :(得分:16)

使用番石榴:

Sets.intersection(Sets.newHashSet(setA), Sets.newHashSet(setB))

Google Guava Library

答案 3 :(得分:8)

怎么样

private List<String> intersect(List<String> A, List<String> B) {
    List<String> rtnList = new LinkedList<>();
    for(String dto : A) {
        if(B.contains(dto)) {
            rtnList.add(dto);
        }
    }
    return rtnList;
}

答案 4 :(得分:2)

有一种很好的方法可以在一行代码中执行此操作,并且您可以使用不同于containsAll方法afaik的相同类型的两个列表:

columnsOld.stream().filter(c -> columnsNew.contains(c)).collect(Collectors.toList());

具有不同类型的列表的示例。如果你在foo和bar之间有一个实现,你可以从foo获得一个bar-object,而不是修改你的流:

List<foo> fooList = new ArrayList<>(Arrays.asList(new foo(), new foo()));
List<bar> barList = new ArrayList<>(Arrays.asList(new bar(), new bar()));

fooList.stream().filter(f -> barList.contains(f.getBar()).collect(Collectors.toList());

答案 5 :(得分:1)

如果你把第二个列表放在一个集合中说HashSet。只需迭代第一个列表检查集合上的状态,如果不存在则删除,您的第一个列表最终将具有您需要的交集。 它将比retainAll更快或包含在列表中。 这里的重点是使用集合而不是列表。查找是O(1)。 firstList.retainAll(new HashSet(secondList))也可以工作。

答案 6 :(得分:0)

如果不关心事件,请使用retainAll,否则使用N.intersection

a = N.asList(12, 16, 16, 17, 19);
b = N.asList(16, 19, 107);
a.retainAll(b); // [16, 16, 19]
N.println(a);

a = N.asList(12, 16, 16, 17, 19);
b = N.asList(16, 19, 107);
a = N.intersect(a, b);
N.println(a); // [16, 19]

N是AbacusUtil

中的实用程序类

答案 7 :(得分:0)

使用org.apache.commons.collections4.ListUtils#intersection