LinkedList kopiert sich!

TheBodo

Erfahrenes Mitglied
Hey,

ich arbeite mit einer LinkedList aus dem util-Package!
Allerdings gibtes ein Problem!

Meine Liste enthält Songs, alle die auf meinem PC sind, und diese werden jetzt in eine JList geschrieben!
So wenn ich nun einen auswähle und auf hinzufügen drücke, soll es in einen neue LinkedList gespeichert werden.
Da beide Listen serialisiert werden kann man den Unterschied gut erkennen!
Und es gibt keinen! Sie sind beide gleich groß und haben den selben Inhalt!
Und das obwohl ich clone! Also das Objekt neu erstelle!

Bitte helft mir.. hier mal der Code:

Code:
	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		if (source == listwahl) {
			if (songs.getSelectedValue() != null) {
				Song gew = (Song) songs.getSelectedValue();
				wish(gew.clone());
			}
		}
             }



	public void wish(Song x) {
		wishes.wish(x); // wishes is die WishList
			try {
				boolean writable = false;
				while (!writable) {
					BufferedReader f = new BufferedReader(new FileReader("N:\\WishUWhat\\switch.swh"));
					writable = f.readLine().contains("0");
					f.close();
				} // Testing Writability
				System.out.println("1");
				
				FileWriter f1 = new FileWriter("N:\\WishUWhat\\switch.swh");
				f1.write("1");
				f1.close(); // set not writable
				System.out.println("2");
				
				wishes.serialize();
				FileOutputStream fs = new FileOutputStream("N:\\WishUWhat\\wishes.mlb");
				ObjectOutputStream os = new ObjectOutputStream(fs);
				os.writeObject(wishes); 
				os.close();
				System.out.println("3");

				FileWriter f2 = new FileWriter("N:\\WishUWhat\\switch.swh");
				f2.write("0");
				f2.close(); // set writable
				System.out.println("4");
				
				
			} catch (IOException e) {
					System.out.println(e);
			}
		}
	}


MediaLib:

package basics;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.LinkedList;


public class MediaLib implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3330967274746414972L;
	private static LinkedList<Song> media = new LinkedList<Song>();
	private String name;
	
	public MediaLib (String name) {
		this.name = name;
	}
	
	public void serialize() {
		try {
			FileOutputStream fs = new FileOutputStream("N:\\WishUWhat\\" + this.name + "_medialibdata.mlb");
			ObjectOutputStream os = new ObjectOutputStream(fs);
			os.writeObject(media); 
			os.close();
			System.out.println("Speichern hat geklappt!");
				
		} catch (IOException e) {
				System.out.println(e);
		}
	}
	
	public void unserialize() {
		try {
			FileInputStream fs = new FileInputStream("N:\\WishUWhat\\" + this.name + "_medialibdata.mlb");
			ObjectInputStream is = new ObjectInputStream(fs);
			media = (LinkedList<Song>) is.readObject();
			is.close();
		} catch (IOException e) {
			System.out.println(e);
		} catch (ClassNotFoundException f) {
			System.out.println(f);
		}
	}
	
	public void add(Song x) {
		media.add(x);
	}
	
	public void wish(Song x) {
		if (exists(x)) 
			getSong(x).vote();
		else
			media.add(x);
	}
	
	public boolean exists(Song x) {
		boolean existenz =  false;
		for (int i = 0; i < media.size() && (! existenz); i++) {
			existenz = media.get(i).toString().equals(x.toString());
		}
		return existenz;
	}
	
	public Song getSong(Song x) {
		Song theSong =  null;
		for (int i = 0; i < media.size(); i++) {
			if (media.get(i).toString().equals(x.toString())) {
			theSong = media.get(i); 
			}
		}
		return theSong;
	}
	
	public Song[] toArray() {
		return media.toArray(new Song[media.size()]);
	}
	
	public Song[] findArtist(String titel) {
		LinkedList<Song> l = new LinkedList<Song>();
		LinkedList<Song> sl = media;
		for (int i = 0; i < sl.size(); i++) {
			if (sl.get(i).getTitel().toLowerCase().contains(titel.toLowerCase()))
				l.add(sl.get(i));
		}	
		Song[] songs = new Song[l.size()];
		for (int o = 0; o < songs.length; o++) 
			songs[o] = l.get(o);
		return songs;
	}
	
	
	public Song[] findTitels(String artist) {
		LinkedList<Song> l = new LinkedList<Song>();
		LinkedList<Song> sl = media;
		for (int i = 0; i < sl.size(); i++) {
			if (sl.get(i).getArtist().toLowerCase().contains(artist.toLowerCase()))
				l.add(sl.get(i));
		}	
		Song[] songs = new Song[l.size()];
		for (int o = 0; o < songs.length; o++) 
			songs[o] = l.get(o);
		return songs;
	}
	
	public String toString() {
		return media.toString();
	}
}

Die mediaLib existiert 2 mal einmal für die komplette Medienbibliothek (aus der ausgewählt wird) und einmal als WishList!
 
Zuletzt bearbeitet:
Hi,

also wenn ich Dich richtig verstehe, enthält Deine Wishlist fälschlicherweise ebenfalls alle Einträge Deiner Musiksammlung, obwohl diese nur die Einträge enthalten sollte, die per Button-Event hinzugefügt werden, richtig?

Ich sehe, dass Deine serialize und unserialize-Methoden bei gleichen Namen in die gleiche Datei schreiben. Diesen Fall kannst Du aber ausschließen, oder?

Übrigens ist die Aufgabe von clone eben gerade das Erstellen einer gleichwertigen Kopie eines Objektes, wenn Du also Deine Songliste clonest, enthält diese natürlich auch alle Einträge der Songliste.

Zeig doch mal, wie und wo Du Deine Wishlist erzeugst.

Gruß, Basti
 
Hi,

erstmal hast du Recht meine Wishlist enthält die selben Einträge wie die Medienbibliothek!

Aber all deine Anmerkungen kann ich ausschlißen:

1. Es gibt ja den Namen damit das nicht passiert! Die Medienbibliothek heißt "MediaLibrary" und die Wishlist "wishes"! Außerdem wird ja noch gar nich serialisiert bzw deserialisiert!

2. Ich clone ja auch nur den Song und das auch nur, weil ich dachte, wenn ich ihn aus der Liste nehme kopiert sich die Liste mit bzw wäre die gleiche (das Java-kennt-nur-pointer-prinzip)!

Aber soviel nur dazu! Ich hab mich da genauer reingefuchst und gesehen, dass die LinkedList von wishes erst überschrieben wird, wenn ich die MediaLibrary deserialisiere!

Also: Wenn die MediaLibrary noch nicht geladen ist, hat auch wishes noch keinen Inhalt, obwohl sie wie folgt aufgerufen werden:

Code:
	private MediaLib wishes =  new MediaLib("wishes");
	private MediaLib media =  new MediaLib("MediaLibrary");

Momentan arbeite ich damit dass ich einfach den MediaLib-Code in einen neue Klasse WishList schreibe und seperet nutze so ungefähr:

Code:
	private WishList wishes =  new WishList("wishes");
	private MediaLib media =  new MediaLib("MediaLibrary");

Dann pssiert das nicht, aber cih würde das Liber nur mit einer Klasse lösen!
Müsste doch eigentlich gehen, oder?
 
Hi Danke für Antworten!

Aber:

Fehler selbst gefunden!
Meine LinkedList war auf static gesetzt!

Also das hab ich weg gemacht!

Danke bis bald!
 
hi,

ich habe nur eine Anmerkung, die nicht direkt mit deiner Frage zusammenhängt.

Du benutzt in mehreren Methoden LinkedList<> und dabei die Methode LinkedList.get(int) innerhalb einer Schleife. Vom Ergebnis her machen deine Methoden was sie sollen, du beachtest aber nicht die Komplexität deiner Operationen: bei LinkedList.get(int) wird jedes mal die Liste von Anfang an durchgeackert, du erhöhst also in den for-Schleifen die Komplexität von den möglichen O(N) auf O(N^2).

Wenn du das so programmierst, dann benutze entweder statt LinkedList<> einen Vektor<>, oder benutze einen ListIterator um den Container zu durchlaufen.

Gruß
Peter
 
Danke für den Tipp!

Ich benutze die Liste eigentlich nur weil meine selbstgete immer einen StackOverFlow hatte, und da hatte ich einige Methoden die Schnell waren, aber bei der Linked List musst ich mich durchwurschteln, is aber auch nich so wichtig, da das durchuschen der Liste nur ein paar Sekunden brauch! Und der Mensch zum auswählen eh länger.. aber trotzdem Danke!
 

Neue Beiträge

Zurück