Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Java ::  Problem beim Kopieren von Objekten [etwas ordentlicher]     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
freakC++
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1902
Beitrag 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




Beitrag 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
Beitrag 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




Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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 :D

LG, freakC++
wxSkip
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.11.2009
Beiträge: 1986
Beitrag 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
Beitrag 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
c++.de :: Java ::  Problem beim Kopieren von Objekten [etwas ordentlicher]   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.