您正在尝试做一些Java并不是真正意义上的事情.
如果能够这样做,最好向Object1添加一个属性,它将是包含与此相关的对象的Object2列表.
如果你不能,我们仍然可以选择天真地做,否则你可以尝试这样的事情:
HashSet hs = new HashSet(list2.size());
for(Object2 o : list2) {
hs.add(o.object1id);
}
//hs contains all the ids of list2
List result = new ArrayList(); //Or another class implementing List
for(Object1 o : list1) {
if(hs.contains(o.id))
result.add(o);
}
因为你必须在HashSet中存储所有id,所以并不漂亮,但由于在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> hm = new HashMap>();
for(Object2 o : list2) {
List l = hm.get(o.objectid1);
if(l != null) {
l.add(o);
} else {
List l = new ArrayList();
l.add(o);
hm.put(o.objectid1, l);
}
//hm is map, where each entry contains the list of Object2 associated with objectid1
List result = new ArrayList();
for(Object1 o : list1) {
List 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),但具有更大的常数……