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

Pen*_*m10 61 java intersection list

问题很简单:

我有两个List

List<String> columnsOld = DBUtils.GetColumns(db, TableName);
List<String> columnsNew = DBUtils.GetColumns(db, TableName);
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*man 111

你可以使用retainAll方法:

columnsOld.retainAll (columnsNew);
Run Code Online (Sandbox Code Playgroud)

  • 注意:为了使用除了`String`之外的其他对象,你当然需要实现`equals`和`hashCode`. (12认同)

bjo*_*hol 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);
}
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*hyk 16

使用番石榴:

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

谷歌番石榴图书馆


小智 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果B包含未包含在A中的元素,则不需要迭代这些元素,因为我们试图找到A和B中的所有元素. (7认同)