Liste kopieren

Status
Nicht offen für weitere Antworten.

handoffate

Mitglied
Hi,

ich verzweifel gerade an meiner Liste..
Ich habe eine klassische Liste geschrieben, mit einer Klasse für die Knoten in der eigentlich nur die Daten stehen etc..
Eine weitere Klasse für die Liste mit Funktionen zum Einfügen, Löschen und anderen quatsch den man so brauchen kann...
Nun möchte ich die Liste kopieren:
Java:
 public myList copy(){
mynode akt= head;
mylist result=new myList();
while(akt!=null){
result.insert(akt);
akt=akt.getNext();
}
return result;
}

habe ich da ein generelles Problem mit der herangehensweise??
ich handle mir damit eine Endlosschleife ein, wenn ich jedoch beim Einfügen einen NEUEN knoten erstelle funktioniert es!????
 
S

SlaterB

Gast
eine Endlosschleife ist doch kein Grund, den Computer oder das Gehirn auszuschalten,

erstelle dir eine Testliste mit drei Elementen 1, 2, 3
und wenn die Schleife mehr als 4x durchlaufen wird, dann gib dir zu jeden Knoten dessen Inhalt aus (1, 2, 3),
notfalls dessen genaue Verlinkung, eine eindeutige Id/ hashCode() für den Knoten usw.,
das kann man alles herausfinden


allgemein liegst du mit dem letzten Satz richtig, ein Knoten gehört zu einer Liste, den kannst du nicht einfach woanders einfügen,
schlimmstenfalls geht alles kaputt, bestenfalls ist nur die Originalliste unbrauchbar geworden,
erstelle die Kopie
 

handoffate

Mitglied
allgemein liegst du mit dem letzten Satz richtig, ein Knoten gehört zu einer Liste, den kannst du nicht einfach woanders einfügen,
schlimmstenfalls geht alles kaputt, bestenfalls ist nur die Originalliste unbrauchbar geworden,
erstelle die Kopie

hmm aber wenn ich Java richtig verstanden habe läuft das ganze doch so:
der Knoten ist ein Objekt welches in meinem Speicher sein Dasein fristet. Beim Einfügen in die Liste bekommt diese doch "nur" einen Pointer auf den Speicherbereich in dem mein Objekt liegt.
Warum kann ich dann in eine andre Liste nicht einen Pointer auf den selben bereich packen???
 

faetzminator

Gesperrter Benutzer
Warum kann ich dann in eine andre Liste nicht einen Pointer auf den selben bereich packen???

Natürlich kannst du das, aber wenn in einer Liste das Objekt geändert wird, ist es natürlich auch in der anderen Liste geändert worden - es ist ja nunmal das gleiche Objekt. Du musst in [c]clone()[/c] alle Unterobjekte ebenfalls klonen.
 
S

SlaterB

Gast
eine Strickjacke besteht aus Strick-Faden, da kannst du doch beim Kopieren nicht den Faden aus der einen Jacke rausnehmen und in die andere Jacke einfügen

gut, beim Programmieren gibts Referenzen, theoretisch können beide Jacken die gleichen Fäden benutzen,
aber wenn dann bei der einen Jacke ein Ärmel abgeschnitten wird, dann auch gleichzeitig bei der anderen Jacke ;)
 

faetzminator

Gesperrter Benutzer
das ist ja genau der sinn der angelegenheit.. was meinst du mit dem klonen??

Du implementierst die für dein Objekt zu implementierende Methode ebenfalls in den abhängigen Klassen und kannst es auf deren Objekte jeweils aufrufen. Wie bereits erwähnt gibt es da [c]clone()[/c], welches in der Java API bereits vorkommt. Du musst also mit [c]copy()[/c] das Rad nicht neu erfinden.
 

handoffate

Mitglied
Elemente die selbst Listen sind
ebenenfalls (rekursiv) klonen.

hab ja keine elemente die listen sind...

ich versteh einfach nur nicht, warum der code oben nicht funktioniert..

dass ich damit zwei listen bekomme die praktisch die selben sind (mit den erwähnten nachteilen) ist mir klar (und das ist auch gewollt auch wenns in diesem Beispiel keinen sinn macht :oops:)
 

Shulyn

Bekanntes Mitglied
Java:
public myList copy(myList alt) {

mylist kopie = new myList();

for (mynode next:alt) {

kopie.add(alt.getWert());

}
return result;
}

Oder habe ich was falsch verstanden? Du hast 1 Liste und willst Sie Kopieren...
 

handoffate

Mitglied
Java:
public myList copy(myList alt) {

mylist kopie = new myList();

for (mynode next:alt) {

kopie.add(alt.getWert());

}
return result;
}

Oder habe ich was falsch verstanden? Du hast 1 Liste und willst Sie Kopieren...

ich verstehe zwar diese for-Schleife nicht so ganz, aber wenn ich das richtig sehe ist das doch eigentlich das gleiche was ich auch gemacht hab??

Also nochmal was ich wollte:
Ich habe eine Liste.. die möchte ich kopieren, also eine neue Liste erstellen in der die GLEICHEN Objekte stehen wie in der alten
(myList neu= alt; tuts zwar bringt mir aber nichts ;) )
 

faetzminator

Gesperrter Benutzer
Was für eine Liste denn? Erbt sie von [c]java.util.List[/c]? Dann kannst du einfach [c]clone()[/c] aufrufen. Ansonsten wär es hilfreich, wenn du die gesamte Klasse posten würdest.
 

handoffate

Mitglied
Was für eine Liste denn? Erbt sie von [c]java.util.List[/c]? Dann kannst du einfach [c]clone()[/c] aufrufen. Ansonsten wär es hilfreich, wenn du die gesamte Klasse posten würdest.

ne erbt von gar nichts.. ist ganz "eigen" gebastelt..
also:
Klasse für die Knoten
Java:
public class dlnode {

	private String title;
	...
	private dlnode next;
	
	
	public dlnode(String title, String path, String description, String comment, String language) {
		this.title=title;
		this.path=path;
		this.description=description;
		this.comment=comment;
		this.language=language;
		this.next=null;
	}
	
//get und set Methoden
	
	public String toString(){
		return title+";"+path+";"+description+";"+comment+";"+language+"\n";
	}
}
Klasse für die Liste:
Java:
public class dlist {

	private dlnode head;
	//private int count;
	
	public dlnode getHead(){
		return this.head;
	}
	
	public dlist(){
		head=null;
		//count=0;
	}
	
	public void eraseList(){
		head=null;
		//count=0;
	}
	
	public boolean isEmpty(){
		if (this.head==null)
			return true;
		else
			return false;
	}
	
	public void sortedinsert(dlnode toinsert){
		dlnode akt=head;
		dlnode last=null;
		if (isEmpty()){
			head=toinsert;
			//count++;
		}
		else {
			while(akt!=null){
				if (akt.getTitle().compareTo(toinsert.getTitle())<0){
					if (akt.getNext()==null){
						akt.setnext(toinsert);
						//count++;
						break;
					}
					else{
					last=akt;
					akt=akt.getNext();
					}
				}
				else {
					last.setnext(toinsert);
					toinsert.setnext(akt);
					//count++;
					break;
				}
			}
		}
	}
	
	public dlist copy(){
		dlist res= new dlist();
		dlnode akt=head;
		while(akt!=null){
			res.sortedinsert(akt);
			akt=akt.getNext();
		}
		return res;
		
	}

	
	public String toString(){
		dlnode akt=head;
		String res="";
		if (isEmpty())
			return "Liste ist leer";
		else {
			while (akt!=null) {
				res+="Knoten:";
				res=res+akt.toString();
				akt=akt.getNext();
			}
			return res;
		}
		
	}
}

wie erwähnt macht die copy() probleme.. Der Rest klappt wunderbar.
clone() würde mir nichts bringen (da ich im endeffekt noch aussuchen möchte welche Knoten ich kopiere)
 

faetzminator

Gesperrter Benutzer
implementier ein clone() in dlnode (schreib doch bitte DlNode -> Konventionen) so etwas:
Java:
public Object clone() {
    return new dlnode(this.title, this.path, [...]);
}
Das rufst du z.B. jeweils mit [c]akt.getNext().clone()[/c] statt [c]akt.getNext()[/c] auf. Musst natürlich die [c]dlnode next[/c] noch setzen.
 

handoffate

Mitglied
implementier ein clone() in dlnode (schreib doch bitte DlNode -> Konventionen) so etwas:
Java:
public Object clone() {
    return new dlnode(this.title, this.path, [...]);
}
Das rufst du z.B. jeweils mit [c]akt.getNext().clone()[/c] statt [c]akt.getNext()[/c] auf. Musst natürlich die [c]dlnode next[/c] noch setzen.

wo meinst du soll ich das aufrufen? nur in copy() oder auch in den anderen funktionen??

aber: wenn ich da ein clone() mache, erzeuge ich eine zweite Liste mit NEUEN Objekten.. Das heißt, wenn ich in einer der Listen etwas ändere wird die andere nichts davon mitbekommen. sehe ich richtig oder?
 
Zuletzt bearbeitet:

Shulyn

Bekanntes Mitglied
aber: wenn ich da ein clone() mache, erzeuge ich eine zweite Liste mit NEUEN Objekten.. Das heißt, wenn ich in einer der Listen etwas ändere wird die andere nichts davon mitbekommen. sehe ich richtig oder?

Ja es sind dann NEUE Objekte mit dem Inhalt der alten. Oder willst du nur neue Referenzen haben? Dann würde ein NeueListe = AlteListe reichen!
 

handoffate

Mitglied
Ja es sind dann NEUE Objekte mit dem Inhalt der alten. Oder willst du nur neue Referenzen haben? Dann würde ein NeueListe = AlteListe reichen!

Das ist ja mein Problem: Ich möchte keine NEUEN Objekte, da sich beide Listen vollkommen identisch verhalten sollen (änder ich etwas in der einen so soll es auch in der anderen geändert sein)
ein NeueListe = AlteListe bringt mir nichts: das Beispiel mit dem Copy war vielleicht etwas irreführend. Ich möchte die Liste zwar kopieren, aber unter umständen nicht alle Knoten sondern nur eine Teilliste...
 

faetzminator

Gesperrter Benutzer
Dann kannst du einfach die jeweiligen Knoten in die neue Liste kopieren, falls xy zutrifft. Aber dann stimmt ja jeweils die getNext() nicht mehr, da du dort alle zurückbekommen würdest. Das Feld überschreiben darfst du auch nicht, da es sonst in der "alten" Liste nicht mehr stimmt. Es funktioniert also nicht, ohne alle Nodes zu kopieren. Ansonsten musst du die Daten und Nodeinfos strikt trennen. Du kannst einen Datencontainer haben, welcher sich in einer Node befindet. Diesen kopierst du in eine neue Node.
 

handoffate

Mitglied
Dann kannst du einfach die jeweiligen Knoten in die neue Liste kopieren, falls xy zutrifft. Aber dann stimmt ja jeweils die getNext() nicht mehr, da du dort alle zurückbekommen würdest. Das Feld überschreiben darfst du auch nicht, da es sonst in der "alten" Liste nicht mehr stimmt. Es funktioniert also nicht, ohne alle Nodes zu kopieren. Ansonsten musst du die Daten und Nodeinfos strikt trennen. Du kannst einen Datencontainer haben, welcher sich in einer Node befindet. Diesen kopierst du in eine neue Node.

ahhhhh... vielen Dank.. jetzt hab ich endlich gerafft warum es nicht funktioniert..
da ist meine Welt doch wieder in Ordnung :oops:
werd ich mir wohl mal was anderes überlegen..
thx
 

Shulyn

Bekanntes Mitglied
Also du willst deine Alte liste in eine Neue Kopieren, jedoch nicht alle Objecte..
Und das ohne die Zeiger zu verbiegen..

Wenn ich dich Richtig verstehe :

Altliste = a -> b -> c -> d -> e
Neuliste = a -> c -> e

Problem ist das wenn du in der neuen Liste von C auf E verweisen willst, du den Zeiger (next) von C neue setzen müsstest.

Wie wäre es wenn du dir nur die Referenzen auf die gewollten Objecte speicherst?
Im Oberen fall wären das : Head.next / b.next / d.next . Diese wiederrum in eine neue Liste nur das du statt dem Object den object.next speicherst...
(Oder so ähnlich in der Theorie)
 

handoffate

Mitglied
Also du willst deine Alte liste in eine Neue Kopieren, jedoch nicht alle Objecte..
Und das ohne die Zeiger zu verbiegen..

Wenn ich dich Richtig verstehe :

Altliste = a -> b -> c -> d -> e
Neuliste = a -> c -> e

Problem ist das wenn du in der neuen Liste von C auf E verweisen willst, du den Zeiger (next) von C neue setzen müsstest.

Wie wäre es wenn du dir nur die Referenzen auf die gewollten Objecte speicherst?
Im Oberen fall wären das : Head.next / b.next / d.next . Diese wiederrum in eine neue Liste nur das du statt dem Object den object.next speicherst...
(Oder so ähnlich in der Theorie)

jop auch eine gute idee.. habe nun einfach die gewollten Objekte in einer ArrayList gespeichert.. tuts auf jeden fall..
nachdem ich endlich verstanden hatte was ich falsch mache war eine akzepzable Lösung nur noch ein Katzensprung :)
 

faetzminator

Gesperrter Benutzer
Grundsätzlich musst du alle Klassenvariablen ausser [c]next[/c] einfach in ein weiteres Objekt auslagern und eine Instanz dessen in dem Node speichern und zugänglich machen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
R Liste und Arrays Java Basics - Anfänger-Themen 12
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
M Verkettete Liste Java Basics - Anfänger-Themen 1
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
E Elemente aus Liste entfernen und hinzufügen Java Basics - Anfänger-Themen 3
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
thor_norsk Verkette Liste Java Basics - Anfänger-Themen 27
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
M Java Liste streamen Java Basics - Anfänger-Themen 10
AmsananKING Aussortierung einer Liste Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
Z Liste umkehren Java Basics - Anfänger-Themen 1
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
P Performance Array und Liste Java Basics - Anfänger-Themen 13
M QuickSort und Liste Java Basics - Anfänger-Themen 6
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Koordinate in Liste suchen Java Basics - Anfänger-Themen 20
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
M Array liste Verdrehen Java Basics - Anfänger-Themen 8
A Verkettete Liste Java Basics - Anfänger-Themen 2
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Liste von Tagen generieren ab einem bestimmten Datum und Endedatum Java Basics - Anfänger-Themen 4
S IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste Java Basics - Anfänger-Themen 11
B Liste sortieren? Java Basics - Anfänger-Themen 4
O Anonyme Klasse einer Liste erstellen Java Basics - Anfänger-Themen 7
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
L verkettete Liste Java Basics - Anfänger-Themen 15
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
O ADT Liste z. B. Java Basics - Anfänger-Themen 15
B sortierte Liste Java Basics - Anfänger-Themen 4
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
J Eine Liste von Listen erstellen Java Basics - Anfänger-Themen 11
A Einträge aus Tupeln nach Regeln in Liste speichern Java Basics - Anfänger-Themen 8
Queiser Liste zurückgeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
S spezielle Wörter aus Liste entfernen Java Basics - Anfänger-Themen 2
H Verkettete Liste Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben