| Autor |
Nachricht |
freakC++
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1902
|
freakC++ Mitglied
19:40:54 12.04.2012 Titel: |
Problem beim Kopieren von Objekten [etwas ordentlicher] |
Zitieren |
Hallo zusammen,
ich merke, dass meine letzte Beschreibung meines Problems sehr in die Irre führen kann. Also probiere ich, mich etwas deutlicher auszudrücken.
Ich bin dabei eine (lineare) List zu implementieren. Dabei hat jedes Element der Liste genau einen Wert und einen Nachfolger. So kann man sich durch die ganze Liste hangeln.
Ich möchte nun eine Methode schreiben, die jedes Tripel zyklisch rotieren lässt. Angenommen, ich habe die Liste 0 1 2 3. Dann würde nun meine Methode das erste Tripel zyklisch rotieren lassen und es käme 2 0 1 3 heraus. Falls es zwei vollständige Tripel gäbe, so würden natürlich beide rotiert. Die Liste 0 1 2 3 4 5 würde also zu 2 0 1 5 3 4.
Leider funktioniert meine Methode nicht. Ich hab erst einmal keine Schleife eingebaut, sodass erst einmal nur das erste Tripel bearbeitet wird.
| Java: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | public void rotateTriplesIter() {
// a b c d --> c a b d
ListItem<T> p = first;
ListItem<T> tmp = null;
//while(p != null && p.next != null && p.next.next != null) {
tmp = p.next.next.next; //d zwischenspeichern
p.next.next.next = p; //Nachfolger von c wird a
p = p.next.next; //erstes Element des Tripels wird c
p.next.next.next = tmp; //Nachfolger von b wird d
//}
} | |
Leider funktioniert dieser Code nicht. Im obigen auskommentiertem Buchstabenbeisoiel wird c nicht als erstes Element angefügt. Aus "a b c d" würde also "b a d" werden, aber nicht "c a b d".
Sieht jemand den Fehler? Ich komm einfach nicht drauf?
Vielen Dank
LG, freakC++ |
Zuletzt bearbeitet von freakC++ am 11:08:13 13.04.2012, insgesamt 2-mal bearbeitet |
|
 |
ey...
Unregistrierter
|
ey... Unregistrierter
11:21:14 13.04.2012 Titel: |
... mann, wo ist mein aut... |
Zitieren |
du setzt doch first nicht neu, oder??
Probiers doch ma so:
tmp = first.next.next
first.next.next = first.next.next.next
tmp.next = first
first = tmp |
|
|
|
 |
freakC++
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1902
|
freakC++ Mitglied
15:04:47 13.04.2012 Titel: |
|
Zitieren |
Nein, first setz ich nicht neu, obwohl ich weiß, dass ich es eigentlich machen müsste. Dann bekomme ich aber das Problem, diese Operation nicht auf eine ganze lineare Liste anwenden zu können, da ja nur beim ersten Mal first neugesetzt werden muss. first muss also immer das erste Element des aktuellen Trippels sein.
Ich habe mal versucht, eine Schleife drumzubauen. Zumindest kommt keine NullPointerException, aber das Ergebnis ist trotzdem falsch.
| Java: | for(ListItem<T> p = first; p != null && p.next != null && p.next.next != null; p = p.next.next.next) {
tmp = p.next.next; //c zwischenspeichern
p.next.next = p.next.next.next; //Nachfolger von b wird d
tmp.next = first; //Nachfolger von c wird a
p = tmp; //c wird zum ersten Element
} | |
Nur, wenn die nächsten drei Elemente alle ungleich null sind, darf der Schleifenrumpf ausgeführt werden. Es liegt bestimmt daran, dass ich first nicht richtig setze. Könnt ihr mir einen Tipp geben, meinen logischen Fehler zu finden?
Bei einer Liste von 0 1 2 3 4 5 6 7 8 9 10 kommt mit obigem Code "0 1 3 4" heraus.
Vielen Dank
LG, freakC++ |
|
|
|
 |
Ich...
Unregistrierter
|
Ich... Unregistrierter
15:20:59 13.04.2012 Titel: |
... guck nochma... |
Zitieren |
... zuhause, anchher...
aber mit Haskell wär das vieeeel leichter... |
|
|
|
 |
Jockelx
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.12.2009
Beiträge: 653
|
Jockelx Mitglied
15:54:23 13.04.2012 Titel: |
|
Zitieren |
Keine gute Idee, in der Schleifensignatur und gleichzeitig im Rumpf mit der Laufvariablen 'p' rumzuhantieren.
Würdest du doch mit einem 'int i' auch nicht machen. |
|
|
|
 |
freakC++
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1902
|
freakC++ Mitglied
16:14:28 13.04.2012 Titel: |
|
Zitieren |
| Jockelx schrieb: | Keine gute Idee, in der Schleifensignatur und gleichzeitig im Rumpf mit der Laufvariablen 'p' rumzuhantieren.
Würdest du doch mit einem 'int i' auch nicht machen. |
Da haste recht . Das ändere ich gleich. Trotzdem ist dadurch mein Problem noch nicht ganz gelöst, weil ich noch immer nicht weiß, wie ich mit dem "first" - Element umgehen muss. Habt ihr da noch einen Tipp für mich?
Vielen Dank
LG, freakC++ |
|
|
|
 |
wxSkip
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.11.2009
Beiträge: 1986
|
wxSkip Mitglied
22:53:31 13.04.2012 Titel: |
|
Zitieren |
Ich würde das etwas mehr strukturieren (ungetestet):
| Java: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ListItem<T> item_1, item_2, item_3, item_4, ancestor_first = null;
for(ListItem<T> p = first; p != null && p.next != null && p.next.next != null;){
item_1 = p;
item_2 = item_1.next;
item_3 = item_2.next;
item_4 = item_3.next;
if(p == first) first = item_3;
else ancestor_first.next = item_3;
item_3.next = item_1;
//item_1.next = item_2; stimmt schon
item_2.next = item_4;
ancestor_first = item_2;
p = item_4; //statt dem alten Schleifenzähler, da war dank der Umordnung ein next zu viel (p == item_1, welches jetzt 2 vor dem neuen Start ist)
} | | |
_________________ Je mehr Käse, desto mehr Löcher. Je mehr Löcher, desto weniger Käse. Also: Je mehr Käse, desto weniger Käse!
Zuletzt bearbeitet von wxSkip am 22:55:35 13.04.2012, insgesamt 2-mal bearbeitet |
|
 |
freakC++
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1902
|
freakC++ Mitglied
15:05:59 14.04.2012 Titel: |
|
Zitieren |
Hallo wxSkip!
Herzlichen Dank für deine Hilfe. Dein Code funktioniert. Bei mir war wohl das Problem, dass ich direkt mit "next" gearbeitet habe und damit die Verbindung zu Objekten verloren habe. Dieses Problem hast Du mit der Auslagerung in lokale Objekte behoben! Super! Gut, dass es in Java den Garbage Collector gibt
LG, freakC++ |
|
|
|
 |
wxSkip
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.11.2009
Beiträge: 1986
|
wxSkip Mitglied
18:54:41 14.04.2012 Titel: |
|
Zitieren |
Was hat das mit dem GC zu tun? Du hantierst ja nur mit Pointern rum und legst keine neuen Objekte an. |
_________________ Je mehr Käse, desto mehr Löcher. Je mehr Löcher, desto weniger Käse. Also: Je mehr Käse, desto weniger Käse!
|
|
 |
freakC++
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1902
|
freakC++ Mitglied
16:00:01 15.04.2012 Titel: |
|
Zitieren |
Stimmt, in diesem Fall nicht. Wenn ich jedoch an das Löschen eines neuen Listenelements denke, so spielt der GC eine Rolle |
Zuletzt bearbeitet von freakC++ am 16:00:26 15.04.2012, insgesamt 1-mal bearbeitet |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|