Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich soll für die Uni eine Aufgabe programmieren und komme bei einer Methode ins Stocken.
Methode:
Java:
MusicDataStore merge(MusicDataStore that) {
for(int i = 0; i < that.oList.size(); i++) {
this.oList.add(that.oList.get(i));
}
for(int i = 0; i < that.cList.size(); i++) {
this.cList.add(that.cList.get(i));
}
HashSet<Opus> setO = new HashSet<>(oList);
HashSet<Composer> setC = new HashSet<>(cList);
oList.clear();
oList.addAll(setO);
cList.clear();
cList.addAll(setC);
return this;
}
MusicDataStore enthält nur zwei ArrayList oList und cList.
Die Methode soll die Elemente aus der that-Liste, die nicht in der this-Liste sind einfügen. Heißt quasi keine doppelten Elemente.
Deswegen auch der Ansatz mit HashSet.
Meine Idee: Erst mal alle Elemente in die Liste hinzufügen, dann in HashSet konvertieren, den Listeninhalt löschen und das HashSet in die Liste "laden".
Lasse ich meine Main ohne diese Methode laufen funktioniert alles, nur wenn ich die Methode einbaue endet es nie. Dauerschleife.
Wo liegt der Fehler? Kann ja nur in den beiden Schleifen liegen oder?
Eine Vermutung: that.oList == this.oList || this.cList == that.cList. Somit fügt er in dieselbe Liste immer neue Elemente hinzu und die Bedingung i < that.oList.size() ist niemals false, da die Liste genauso schnell wächst wie i.
In meiner for Schleife betrachte ich that.cList. Aus dieser Liste werden die Elemente in this.cList gespeichert. Also this.cList wird größer. Aber eigentlich sollte that.cList genau so lange laufen wie viele Elemente that hat und es kommen während des Schleifendurchlaufs auch keine Elemente in that hinzu sondern nur in this.
Macht für mich wenig Sinn, ich meine sind ja an sich zwei verschiedene Listen, weshalb sollten beide größer werden.
Ich hoffe ihr versteht meine Skeptis.
Wo soll ich das prüfen ? seperat am Anfang ? in der Schleife?
Woher willst du das denn wissen? Debugge doch einfach mal die Methode oder gib den von mir angegebenen boole'sche Ausdruck mit System.out.println() aus oder was auch immer. Es wird aber definitiv so sein!
Mal davon abgesehen, dass httpdigest Recht haben wird, solltest du deine Methode ohnehin umbauen.
Lass die beiden for-Schleifen weg, füg einfach die Inhalte der Listen direkt in deine HashSets und mach dann wieder eine Liste draus. Dann kann der jetzige Fehler auch garnicht erst auftreten.
Bei dir passiert gerade sowas in der Art:
Java:
List<String> thisList = new ArrayList<>(Arrays.asList("a", "b", "c"));
List<String> thatList = thisList;
for (int i = 0; i < thatList.size(); i++) {
System.out.println("i: " + i + "\thisList Size: " + thisList.size() + "\tthatList Size: " + thatList.size());
thisList.add(thatList.get(i));
}
Es kommt wie du vermutest hast true raus. Kannst du mir das bitte erklären woran das liegt.
Denn in meiner Vorstellung habe ich zwei Objekte die jeweils zwei Listen haben. Wenn die Liste des einen Objektes sich vergrößert, weshalb soll sich die andere auch vergrößern. Hängt aus der Sicht des Codes ja nicht zusammen. (Zumindest nicht für mich ersichtlich).
Danke Tarrew und httpdigest. Wäre jedoch über eine Erklärung erfreut, außer ich bin zu müde und sehe das offensichtliche nicht.
Edit:Tarrew's Beispiel zeigt es mir. Zumindest lasse ich es so ausgeben. Nachvollziehen kann ich das nicht ganz. Macht für mich logisch keinen Sinn. Aber jetzt weiß ichs.
@Tarrew hat bereits eine gute Erklärung geliefert. Entweder this und that sind exakt dieselben/identischen Objekte, oder die Listen sind exakt dieselben/identisch. Beide Listen sind dieselben/identischen Objekte.