Zwei ArrayListen<String> vergleichen.

Der_Chris2011

Neues Mitglied
Hallo erstmal an alle, ich hab folgendes Problem.
Ich habe 2 ArrayListen eine davon enthält alle Mitarbeiter und eine andere eine Auswahl an Mitarbeitern.
Jetzt würde ich gerne eine dritte erstellen in der Alle Mitarbeiter bis auf die Auswahl drin stehen erzeugen.
Weiß nicht warum aber das klappt nicht!? Habt Ihr da ne Idee?
Code:
ArrayList<String> Mitarbeiter=new ArrayList<String>(Konstanten.MitarbeiterName);
ArrayList<String> MitarbeiterAuswahl=new ArrayList<String>(Konstanten.MitarbeiterAuswahl);
ArrayList<String> MitarbeiterNeu=new ArrayList<String>();

for (int i=0;i<Mitarbeiter.size();i++){
     for (int j=0;j<MitarbeiterAuswahl.size();j++){
         if (Mitarbeiter.get(i)!=MitarbeiterAuswahl.get(j)){
              MitarbeiterNeu.add(Mitarbeiter.get(i));
         }
     }
}
 
Nein das geht natürlich auch nicht. Aber ich finde jeder Programmierer und sei er noch so ein Anfänger, sollte in der Lage sein sich einen Stift und ein Blatt Papier zu nehmen und einfach mal die programmabfolge Skizzieren können. Dann fällt nämlich sofort auf warum das alles Blödsinn ist was der TO da programmiert hat.

Gruss

Claus
 
So will ich mal nicht sein:
Eine ArrayList hat eine contains() Methode, die dir zurückgibt, ob ein übergebenes Objekt in der Liste vorhanden ist.

[TIPP]
Die contains Methode ist nicht sonderlich performant. Daher sollte man bei großen Listen eher Sets verwenden.
[/TIPP]
 
Es gibt dafür auch eine extra methode:
Code:
removeAll
:

Java:
List<String> all = ...
List<String> selected = ...
List<String> notSelected = new ArrayList<String>(all); // erstmal alle rein
notSelected.removeAll(selected); // alle selektierten raus
Das spart einiges an Code und ist viel besser zu lesen als so ne for-Schleife, in der du ja auch nur das nachprogrammierst, was in
Code:
removeAll
passiert.

Ich würde mir den redundanten Code sparen und die Methoden nutzen, die dir die API zur Verfügung stellt.
 
Es gibt dafür auch eine extra methode:
Code:
removeAll
:

Java:
List<String> all = ...
List<String> selected = ...
List<String> notSelected = new ArrayList<String>(all); // erstmal alle rein
notSelected.removeAll(selected); // alle selektierten raus
Das spart einiges an Code und ist viel besser zu lesen als so ne for-Schleife, in der du ja auch nur das nachprogrammierst, was in
Code:
removeAll
passiert.

Ich würde mir den redundanten Code sparen und die Methoden nutzen, die dir die API zur Verfügung stellt.

Bis du sicher, dass removeAll() die Inhalte vergleicht und nicht die Referenzen? Kann ich mir eigentlich nicht vorstellen.

Gruß

Claus
 
Removes all of this collection's elements that are also contained in the specified collection (optional operation). After this call returns, this collection will contain no elements in common with the specified collection.

This implementation iterates over this collection, checking each element returned by the iterator in turn to see if it's contained in the specified collection. If it's so contained, it's removed from this collection with the iterator's remove method.

Note that this implementation will throw an UnsupportedOperationException if the iterator returned by the iterator method does not implement the remove method and this collection contains one or more elements in common with the specified collection.

In der AbstractList steht das dazu. Ich würde generell davon ausgehen, dass es sich um einen equals Vergleich handelt, Referenzvergleich wäre in den meisten Fällen in der Praxis gar nicht verwendbar.
 
In der AbstractList steht das dazu. Ich würde generell davon ausgehen, dass es sich um einen equals Vergleich handelt, Referenzvergleich wäre in den meisten Fällen in der Praxis gar nicht verwendbar.

Dann würde diese Methode doch aber nicht mit Arrays funktionieren die Objecte enthalten. Es sei denn das Object implementiert die equals Methode und davon kann man ja nicht ausgehen oder?

Gruß

Claus
 
Zuletzt bearbeitet:
Natürlich kann man davon ausgehen. Jedes Objekt hat eine equals Methode, die wird vom Ur-Objekt "Objekt" vererbt. Und generell sollte man schon diese und hashCode() überschreiben um ein Verständnis von Gleichheit zu erzeugen.
 
Natürlich kann man davon ausgehen. Jedes Objekt hat eine equals Methode, die wird vom Ur-Objekt "Objekt" vererbt. Und generell sollte man schon diese und hashCode() überschreiben um ein Verständnis von Gleichheit zu erzeugen.

Nur damit ich das richtig verstanden habe:

Wenn ich eine eigene Klasse anlege, dann erbt die immer von einem "Urobject" wie Du es nennst und hat damit automatisch equals implementiert?

Gruß

Claus
 

Zurück
Oben