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

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

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

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

object1.id = object2.object1id

这将导致List<Object3>代表左连接的。我可以用Java来对算法进行硬编码(例如。

您有更好的解决方案吗?(如果可能,请提供代码,谢谢!)

回答:

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

如果能够做到,则最好 ,该 是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)中,但常数更大…

以上是 两个不同的Java对象的“左连接” 的全部内容, 来源链接: utcz.com/qa/409140.html

回到顶部