Si sta cercando di fare qualcosa che Java non è davvero significava per.
Se siete in grado di farlo, si sarebbe meglio aggiungendo un attributo alla Object1
, che sarebbe un elenco di Object2
contenente gli oggetti legati alla this
.
Se non è possibile, abbiamo ancora la possibilità di farlo ingenuamente, altrimenti si potrebbe provare qualcosa di simile:
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);
}
Non abbastanza, poiché è necessario memorizzare tutti gli ID di un HashSet, ma dal momento che l'aggiunta e accedere agli elementi in HashSet sono O (1) (in teoria), l'algoritmo è O (n + m)
Se la classe Object3
è costruito con un Object1
e Object2
, utilizzare un HasMap
invece di HashSet
dove le chiavi sono id e i valori object2. L'ultima for
ciclo nel codice diventerà:
Object2 o2 = hs.get(o.id);
if(o2 != null)
result.add(new Object3(o, o2);
A seguito di Óscar López commento:
Se l'objectid1 vostro non unico, è necessario adattare il codice come segue:
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));
}
Ancora in O (n + m), ma con costanti più grandi ...
Quindi vuoi una collezione che abbia solo oggetti dal primo elenco e dal secondo elenco se sono uguali in base al loro ID? – Makoto
in base al join sinistro, la nuova raccolta avrebbe tutti gli elementi di collection1 e solo gli elementi corrispondenti di collection2 in base all'ID corrispondente – Stephane
Qualcuno di questi è ordinato? – Volune