我有两节课:
public class AClass{
String name;
int id;
int total;
}
public class BClass{
String batchName;
int id;
}
现在我有两个列表:
List<AClass> aLst;
List<BClass> bLst;
在这两个列表之间,我需要检查是否为AClass.id==BClass.id
。
一种实现方法是让两个 for 循环并进行比较。但这不是有效的方法。
其他方法是使用HashMap
。遍历BClass
列表,并将BClass.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);
}
这是比较有效的方法吗?
答案 0 :(得分:2)
使用Set<Integer>
存储来自AClass
的标识符会更加容易。由于Set.contains()
为O(1),因此总复杂度为O(n)。
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());
但是对于小型列表,在Set
中创建其他Integer
和装箱标识符的成本可能超过减少迭代次数的好处。