栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

两个不同的Java对象的“左连接”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

两个不同的Java对象的“左连接”

您正在尝试做Java真正不想要的事情。

如果能够做到,则最好 将属性添加到

Object1
,该 属性
Object2
包含与相关的对象的列表
this

如果您做不到,我们仍然可以选择天真地做,否则您可以尝试这样的操作:

HashSet<Integer> hs = new HashSet<Integer>(list2.size());for(Object2 o : list2) {    hs.add(o.object1id);}//hs contains all the ids of list2List<Object1> result = new ArrayList<Object1>(); //Or another class implementing Listfor(Object1 o : list1) {    if(hs.contains(o.id))        result.add(o);}

这不是很漂亮,因为您必须将所有id存储在HashSet中,但是由于在HashSet中添加和访问元素在理论上是O(1),因此算法是O(n + m)

如果您的

Object3
类是使用
Object1
和构造的
Object2
,请使用,
HasMap
而不是
HashSet
键为id和值object2的位置。
for
代码中的最后一个循环将变为:

Object2 o2 = hs.get(o.id);if(o2 != null)    result.add(new Object3(o, o2);

除了ÓscarLópez评论:

如果您的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 objectid1List<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));}

仍在O(n + m)中,但常数更大…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414178.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号