当前位置: 首页 > 面试题库 >

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

纪辰沛
2023-03-14
问题内容

我有一个Object1(List<Object1>)和Object2(List<Object2>)的列表

  • 对象1具有多个属性,包括 id
  • 对象2具有多个属性,包括 object1id

我有一些SQL背景,我想做的是在

object1.id = object2.object1id

这将导致List<Object3>代表左连接的。我可以用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 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键为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 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));
}

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



 类似资料:
  • 我有三节课: 人类 父亲 孩子。 儿童阶级延伸父亲,父亲延伸人类。 我已经创建了每个类的一些实例并将它们存储到ArrayList中。 现在,我想编写一个方法来检查对象father1是否与对象child1地址字段(类Father和Child的实例)具有相同的字段地址(例如:“21 str Goodwin”),并将此方法提供给我的ArrayList,如果发现任何结果,则打印。 我怎么能这样呢? 为了更

  • 问题内容: 我有两个具有相同结构的JSON对象,我想使用Javascript将它们连接在一起。是否有捷径可寻? 问题答案: 根据注释中的描述,您只需执行一个数组concat:

  • 但是,这并不适用于String类。请参见下面的代码: 这是因为字符串类和自声明类之间的差异吗?谢谢你的帮助!

  • 我的问题是,它似乎影响和删除相同的元素从原来的列表!

  • 我有两个arraylist。employee类和user类的ArrayList。employee类将name、age、address作为字段。用户类将名称、年龄、地址作为字段。下面是两个列表 要检查用户是否和员工的地址相同。如果用户没有地址,则从员工处复制。

  • 我想编写一个Java类,根据相关的时间戳计算一些规则(对于每个rueleId)的出现次数。 例如 输入: 输出: 我想我可以利用HashMap。 我认为这里的键是基于ruleId(type:String)和timestamp(type:Calendar)的,值是计数。 我怎样才能拥有基于两个不同对象的密钥?我的方法错了吗?