高端局请入!两个不同 Java 对象实现“左连接”

有一个 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类是用Object1Object2构造的,可以使用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));
}

以上方法仅供参考,欢迎大佬交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值