Sie versuchen, etwas zu tun, dass Java nicht wirklich gemeint für.
Wenn Sie in der Lage sind, es zu tun, würden Sie besser dran Hinzufügen eines Attributs zu Object1
, die eine Liste von Object2
sein würde, die Objekte im Zusammenhang mit this
enthält.
Wenn Sie nicht, wir haben immer noch die Möglichkeit, es naiv zu tun, sonst könnte man so etwas versuchen:
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);
}
Nicht schön, da Sie alle IDs in einem HashSet zu speichern, aber da das Hinzufügen und Elemente in HashSet ist O (1) (theoretisch), der Algorithmus ist O (n + m)
Wenn Object3
Klasse konstruiert ist mit einem Object1
und Object2
, verwenden Sie eine HasMap
anstelle von HashSet
wo der Schlüssel Zugriff sind IDs und die Werte object2. Die letzte for
Schleife im Code werden:
Object2 o2 = hs.get(o.id);
if(o2 != null)
result.add(new Object3(o, o2);
Weitere zu Óscar López Kommentar:
Wenn Ihr objectid1 Ihr nicht eindeutig zuzuordnen, müssen Sie den Code anzupassen, wie folgt:
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));
}
Noch in O (n + m), aber mit größeren Konstanten ...
Sie wollen also eine Sammlung, die nur Objekte aus der ersten und zweiten Liste hat, wenn sie aufgrund ihrer ID gleich sind? – Makoto
basierend auf der linken Join, würde die neue Sammlung alle Elemente von collection1, und nur die übereinstimmenden Elemente von collection2 basierend auf übereinstimmenden ID – Stephane
hat Ist einer Ihrer Liste bestellt? – Volune