有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中两个列表<String>的有效交集?

问题很简单:

我有两张单子

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

我需要得到这些的交叉点。有没有快速的方法来实现这一点


共 (6) 个答案

  1. # 1 楼答案

    使用谷歌的Guava库:

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

    注意:这比简单地使用两个列表进行交集要有效得多:它是O(n+m),而list version是O(n×m)。有200万个项目列表,这是数百万次操作和万亿次操作之间的差异

  2. # 2 楼答案

    怎么样

    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;
    }
    
  3. # 3 楼答案

    由于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);
    }
    

    交点将是列new中留下的值。删除columnsOld中已比较的值将减少所需的比较次数

  4. # 4 楼答案

    您可以使用^{}方法:

    columnsOld.retainAll (columnsNew);
    
  5. # 5 楼答案

    流有一种很好的方法,它可以在一行代码中实现这一点,您可以创建两个不同类型的列表,这是ContainesAll方法afaik无法实现的:

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

    不同类型列表的示例。如果您在foo和bar之间有关联,并且您可以从foo获得bar对象,那么您可以修改流:

    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());
    
  6. # 6 楼答案

    如果不关心事件,则使用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是abacus-common中的一个实用类