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

时间:2018-11-19 19:30:29

标签: 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.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);
}

这是比较有效的方法吗?

1 个答案:

答案 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和装箱标识符的成本可能超过减少迭代次数的好处。