Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ?

Ajlex

Mitglied
Hey, und zwar folgendes:

Ich habe z.B. 4 verschiedene ArrayListen mit Integer als Inhalt:

ListA
ListB
ListC
ListD

Jetzt möchte ich schauen, ob die Integer-Zahlen aus ListD mindestens in ListA, ListB oder ListC vorhanden sind.

Bei insgesamt 4 Listen könnte man noch ListA.containsAll(ListD) benutzen und ListA immer umschreiben zu ListB usw.., allerdings habe ich mehr als 4 Listen und deswegen die Frage:

Wie kann ich am Besten ListD mit allen anderen Listen nacheinander vergleichen, ohne die anderen Listen immer dazuschreiben zu müssen?

Kann ich die anderen Listen (ListA, ListB und ListC) in einer größeren Collection "abspeichern" und dann ListD direkt mit dem neu erstellten Objekt vergleichen?

Ganz wichtig: Ich kann nicht den Inhalt aus ListA, ListB und ListC in einer neuen Liste abspeichern und dann vergleichen!
 
Du kannst doch für jedes Element aus listA schauen, ob es in einer der anderen listen ist. Wenn nicht, ist der test vorbei (ein Element gefunden, dass nicht on einer der anderen Listen ist).

Wenn die Anzahl der anderen Listen nicht konstant sein soll, kannst Du als Parameter ein Array von Listen angeben. Oder eben halt als varargs, was den Aufruf ggf. vereinfacht:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html
 
Du kannst doch für jedes Element aus listA schauen, ob es in einer der anderen listen ist. Wenn nicht, ist der test vorbei (ein Element gefunden, dass nicht on einer der anderen Listen ist).
Aber es sind nicht wie oben Beispielhaft angegeben 4 Listen, sondern knapp 20.
Es wäre kein schöner Code und bisschen umständlich wenn ich 20 mal schreiben müsste:

List1.containsAll(ListD)
List2.containsAll(ListD)
..
..
..
List20.containsAll(ListD)

Wenn ich eine for-each Methode benutzen würde, würde es ja aufs gleiche hinaus gehen, oder?

Wenn die Anzahl der anderen Listen nicht konstant sein soll, ...

Die Anzahl der anderen Listen ist Konstant und deren Inhalt ändert sich ebenfalls nicht.

Gruß, Alex
 
Also jetzt bin ich verwirrt. Was genau willst Du denn prüfen? Zuerst schreibst Du, dass alle Elemente aus einer Liste in allen anderen Listen enthalten sein muss.

Also
a: 1, 3, 5, 7
b: 1, 11, 21
c: 3, 13, 23
d: 5, 15, 25
e: 6, 17, 27

=> Alle Elemente von a sind in einer der Listen aus b, c, d oder e.

Oder muss es ein Subset der anderen Liste sein, also
a: 1, 3
b: 1, 3, 5, 7
c: 1, 2, 3
d: 1, 3, 9, 11
==> Die Elemente von a sind in jeder der anderen Liste enthalten.

Und natürlich macht es einen Unterschied im Code. Wenn Du alles einzeln schreibst, dann hast Du doppelten Code. Du hat ein Code-Teil der wieder und wieder kommt. Wenn Du das als ein Array hast, dann hast Du nur nor for (int index; index < listArray.length; index++) listArray[index]......

Definier genau, was Du haben willst, gib uns Code, den Du evtl. schon geschrieben hast und dann können wir dir auch wirklich helfen. Paar Anregungen hast Du in meiner ersten Antwort schon erhalten.
 
Beispiel:

Vorhandene Listen, deren Inhalt sich nicht ändert:
Code:
A: 0, 1, 2, 3, 4, 5, 6
B: 7, 8, 9, 10, 11
C: 0, 3, 6, 7, 9, 10
D: 2, 4, 5, 6, 8, 9
E: 0, 1, 4, 6, 7, 13

Liste, deren Inhalt sich verändern kann:
Code:
F: 0, 6, 7, 10

Was ich jetzt machen will:
F mit A, B, C, D und E vergleichen, ob der Inhalt von F in einer der anderen Listen vorhanden ist.

Anmerkung: Es reicht, wenn die Zahlen aus F in nur einer Liste von oben enthalten sind.

F <-> A => "false"
F <-> B => "false"
F <-> C => "true" (da Inhalt von F (0, 6, 7, 10) in C (0, 3, 6, 7, 9, 10) enthalten ist)
- beenden -
 
Dann halte die Listen in einer Collection oder in einem Array vor und gehe dies dann dann einfach durch. Die Methode sieht dann relativ einfach aus:
Code:
List getMatchingList(List search) {
  for (List list: myLists) {
    if (list.containsAll(search))
      return list;
  }
  return null;
}

Und myLists kann dann halt ein Array mit den Listen sein oder eine beliebige Collection, die eben die for each Schleife unterstützt.
Statt die Liste zurück zu geben könnte man auch ein boolean Wert zurück geben. Je nachdem, was Du genau machen willst.

Das ist doch ein einfacher und gradliniger Aufbau, oder nicht?
 
Also es hat nicht so wirklich funktioniert.. Habe jetzt doch tatsächlich eine große if-Schleife benutzt wo ich alle 20 Listen mit der einen Liste vergleiche, um da mal ein bisschen weiterzukommen.

Werde (nachdem ich mit dem Programm fertig bin) nochmal versuchen diesen Teil "hübscher" zu gestalten.

Gruß, Alex

(Sorry für Doppelpost, kann aber den Beitrag da oben nicht bearbeiten)
 

Zurück
Oben