Вы пытаетесь сделать то, что 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);
}
Не красиво, поскольку вам нужно сохранить все идентификаторы в HashSet, но так как добавление и доступ к элементам в HashSet - это O (1) (теоретически), алгоритм O (n + m)
Если ваш Object3
класс построен с помощью Object1
и Object2
, используйте HasMap
вместо HashSet
, где ключи являются идентификаторами, а значения - объектом2. Последний цикл for
в коде будет выглядеть следующим образом:
Object2 o2 = hs.get(o.id);
if(o2 != null)
result.add(new Object3(o, o2);
В дополнение к комментарию Óscar Ló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), но с большими константами ...