您正在尝试做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)中,但常数更大…



