Java 使用HashMap比较两个不同类型的列表

Java 使用HashMap比较两个不同类型的列表,java,arraylist,collections,hashmap,processing-efficiency,Java,Arraylist,Collections,Hashmap,Processing Efficiency,我有两门课: public class AClass{ String name; int id; int total; } public class BClass{ String batchName; int id; } 现在我有两个清单: List<AClass> aLst; List<BClass> bLst; 这是比较有效的方法吗?使用集合存储AClass中的标识符会更容易。因为Set.contains()是O(1),

我有两门课:

public class AClass{

    String name;
    int id;
    int total;
}

public class BClass{
    String batchName;
    int id;
}
现在我有两个清单:

List<AClass> aLst;
List<BClass> bLst;

这是比较有效的方法吗?

使用
集合
存储
AClass
中的标识符会更容易。因为
Set.contains()
是O(1),所以总的复杂度将是O(n)

List aLst=。。。;
列表bLst=。。。;
Set id=aLst.stream()
.map(AClass::getId)
.collect(收集器.toSet());
所需列表=bLst.stream()
.filter(b->ids.contains(b.getId()))
.collect(Collectors.toList());

但是,对于小列表,创建额外的
Set
并将标识符装箱到
Integer
中的成本可能超过减少迭代次数的好处。

您没有充分描述实际的比较过程。该过程返回什么,布尔值?如果第一个列表中的第5个元素的id与第二个列表中的第13个元素的id相同,该怎么办?您是在寻找丢失的id还是整个对象?我在寻找bLst中的所有BClass对象的id与ACLlass对象中的id相同。我们可以安全地假设id是不静态的。。。
Map<int,BClass> map = new HashMap<int,BClass>();
List requiredLst <BClass> = new ArrayList<BClass>();
foreach(BClass b : bLst){
    map.put(BClass.id, b);
}

foreach(AClass a : aLst){
    BClass b = map.get(a.id);
    requiredLst.add(b);
}
List<AClass> aLst = ...;
List<BClass> bLst = ...;

Set<Integer> ids = aLst.stream()
    .map(AClass::getId)
    .collect(Collectors.toSet());
List<BClass> required = bLst.stream()
    .filter(b -> ids.contains(b.getId()))
    .collect(Collectors.toList());