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());