有一个 Object1 列表(List<Object1>
)和一个 Object2 列表(List<Object2>
)
- 对象 1 具有多个属性,包括
id
- 对象 2 具有多个属性,包括
object1 id
根据sql语句的经验,我想做的是对两个List执行“左连接”
object1.id = object2.object1id
这将产生一个List<Object3>
表示左连接的结果集。我可以用 Java 硬编码一个算法(for... for...),但我觉得不太靠谱,至少复杂度为 n*m。
可以考虑使用HashSet去实现。
HashSet<Integer> hs = new HashSet<Integer>(list2.size());
for(Object2 o : list2) {
hs.add(o.object1id);
}
//hs contains all the ids of list2
List<Object1> result = new ArrayList<Object1>(); //Or another class implementing List
for(Object1 o : list1) {
if(hs.contains(o.id))
result.add(o);
}
由于必须将所有 id 存储在 HashSet 中,所以这并不简洁,但由于在 HashSet 中添加和访问元素是 O(1)(理论上),所以该算法是 O(n+m)
如果Object3
类是用Object1
和Object2
构造的,可以使用HasMap
而不是HashSet
其中键是 ids,值是 object2。for
代码中的最后一个循环将变为:
Object2 o2 = hs.get(o.id);
if(o2 != null)
result.add(new Object3(o, o2);
如果objectid1 不是唯一的,则必须按如下方式调整代码:
HashMap<Integer, List<Object2>> hm = new HashMap<Integer, List<Object2>>();
for(Object2 o : list2) {
List<Object2> l = hm.get(o.objectid1);
if(l != null) {
l.add(o);
} else {
List<Object2> l = new ArrayList<Object2>();
l.add(o);
hm.put(o.objectid1, l);
}
//hm is map, where each entry contains the list of Object2 associated with objectid1
List<Object1> result = new ArrayList<Object1>();
for(Object1 o : list1) {
List<Object2> l = hm.get(o.id);
//l contains all Object2 with object1id = o.id
for(Object2 o2 : l)
result.add(new Object3(o, o2));
}
以上方法仅供参考,欢迎大佬交流