[Java] object kopieren?

Pagina: 1
Acties:

  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Ik heb het volgende fragment code

code:
1
2
3
4
5
6
7
8
9
10
11
        while (listNode.nextNode != null) {
            if (listNode.isGroterDan(listNode.nextNode))
            {
                Node tempNextNode = listNode.nextNode;
                listNode.nextNode = listNode;
                listNode = tempNextNode;
                swapCount++;
                swapped=true;
            }
            if(swapped)
              listNode = listNode.nextNode;

Ik wil nu NODE(i) omwissellen met NODE(i+1) echter gaat dit fout want:
stel listNode = a en listNode.nextNode =b.
bij
listNode.nextNode = listNode wijzigt listNode.nextNode netjes in a.
Maar de volgende regel, listNode = tempNextNode wordt listNode weer Node b. Dit heeft te maken met de 'pointers' (referenties). Hoe maak ik een copie van een zelfgecreeerd object i.p.v. een referentie naar een object? Ik kan ook met prev aan de gang maar deze oplossing lijkt me eenvoudiger. Ik wil dus een exacte 1 op 1 copie i.p.v. een referentie.

Ik ben malle Pietje niet.


  • nnomiS
  • Registratie: Oktober 2000
  • Laatst online: 02-04 20:36
Elk object heeft een methode die clone heet.....

maar uuhm je wilt toch ook dat listnode maar b verwijst? je hebt eerst
listNode = a
listNode.nextNode = b
dan wil je toch daarna hebben
listNode = b
listNode.nextNode = a

?

[ Voor 66% gewijzigd door nnomiS op 29-03-2005 04:39 ]


  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Ja, dat staat er toch?
listNode.nextNode = listNode

Ik had ook al de search gebruikt maar keek even zonder bril en zag zojuist idd wat over Cloning staan. Thanx, ik ga ff proberen.

Ik ben malle Pietje niet.


  • nnomiS
  • Registratie: Oktober 2000
  • Laatst online: 02-04 20:36
Opzich gaat het wel goed idd enige wat ik niet snap is waarom je als je 2 items omgedraait hebt gaat kijken of je wat omgedraait hebt en dan nog meer dingen doen. Dan kan je ze net zo goed erboven meteen bijzetten. En volgens mij is het ook niet nodig wat je daarna nog doet. Als het een raar verhaal is srry --> bedtijd

Verwijderd

Als 'listNode.nextNode' een pointer is naar de volgende node, kun je dan niet listNode.nextNode.get() gebruiken om het object zelf op te halen?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 08-05 18:46

Gerco

Professional Newbie

Volgens mij gaat er iets helemaal verkeerd hier, (veranderende waardes zijn in elke stap bold):

ListNode: ID=A, NextNode = B
ListNode.NextNode: ID=B, NextNode = C
tempNextNode: leeg.
Java:
1
tempNextNode = Listnode.NextNode
Resultaat:

ListNode: ID=A, NextNode = B
ListNode.NextNode: ID=B, NextNode = C
tempNextNode: ID=B, NextNode = C

Vervolgens:
Java:
1
listNode.NextNode = ListNode


ListNode: ID=A, NextNode = A
ListNode.NextNode: ID=A, NextNode = A
tempNextNode: ID=B, NextNode = C

Hier gaat het dus fout, omdat ListNode en ListNode.NextNode nu hetzelfde object zijn, heb je een circulaire referentie gemaakt.

Vervolgens doe je:
Java:
1
listNode = tempNextNode;
Met als resultaat:

ListNode: ID=B, NextNode = C
ListNode.NextNode: ID=C, NextNode = D
tempNextNode: ID=B, NextNode = C

Omdat je nu B toewijst aan ListNode, ben je A helemaal kwijtgeraakt(tenzij er nog een Node voorzit die een referentie houdt naar A). B heeft namelijk zijn eigen NextNode, C.

[ Voor 15% gewijzigd door Gerco op 29-03-2005 08:41 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Bovenin heb ik listnode wel in een: Node bewaarLaatsteNode = listNode; gezet. Ik probeer even verder. Het klopt dat het fout gaat (heb al menigmaal debugged). Ik kan clone niet gebruiken. Ik moet dus een get maken? Of elke Node van prev voorzien? Het was al laat maar met 2 uur slaap kom ik er wel weer bovenop :)

Dit is dan het bijna werkende resultaat
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    do {
        swapCount = 0;
        swapped = false;
        Node bewaarLaatsteNode = listNode;
        while (listNode.nextNode != null) {
            if (listNode.isGroterDan(listNode.nextNode))
            {
                Node tempNextNode = listNode.nextNode;
                listNode.nextNode = bewaarLaatsteNode;
                listNode = tempNextNode;
                swapCount++;
                swapped=true;
            }
            if(swapped){
                swapped = false;
            }
            else{
                listNode = listNode.nextNode;
            }
              
        }


    } while (swapCount > 0);

   }
}


Echter krijgen alle Nodes de data van node A. Iemand idee wat hier nou echt fout gaat?

[ Voor 96% gewijzigd door BeachPatroller op 29-03-2005 10:07 ]

Ik ben malle Pietje niet.


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 08-05 18:46

Gerco

Professional Newbie

Je denkt over je list als een Array, maar het is geen array. Het is een linked list van objecten en dat is iets heel anders. Je probeert de objecten fysiek om te draaien in het geheugen, maar dat is helemaal niet nodig. Dit is wat je zou kunnen doen:

Voor: A - B - C - D
code:
1
2
3
     /----\
Na: A   B  C ... D
         \/

A wijst dus nu naar C en C wijst naar B (en B wijst naar D, maar dat tekent lastig in ascii), logisch is de volgorde dus nu:

A - C - B - D

De locatie van de objecten in het geheugen is niet veranderd, alleen hun plaats in de lijst. De locatie in het geheugen is ook helemaal niet relevant. Ik hoop dat je hiermee wat verder komt.

[ Voor 12% gewijzigd door Gerco op 29-03-2005 10:55 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Gerco schreef op dinsdag 29 maart 2005 @ 10:50:
Je denkt over je list als een Array, maar het is geen array. Het is een linked list van objecten en dat is iets heel anders. Je probeert de objecten fysiek om te draaien in het geheugen, maar dat is helemaal niet nodig. Dit is wat je zou kunnen doen:

Voor: A - B - C - D
code:
1
2
3
     /----\
Na: A   B  C ... D
         \/

A wijst dus nu naar C en C wijst naar B (en B wijst naar D, maar dat tekent lastig in ascii), logisch is de volgorde dus nu:

A - C - B - D

De locatie van de objecten in het geheugen is niet veranderd, alleen hun plaats in de lijst. De locatie in het geheugen is ook helemaal niet relevant. Ik hoop dat je hiermee wat verder komt.
Simpel tekeningetje werkt altijd.


Je kan dat zo implementeren:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
/*
A = bewaarLaatsteNode
B = listNode
C = tempNextNode = listNode.next
D = tempNextNode.next =  listNode.next.next
*/

// verwijzing A naar C
bewaarLaatsteNode.next = listnode.next; 
// verwijzing B naar D
listnode.next = listnode.next.next;
// verwijzing C naar B
bewaarLaatsteNode.next.next = listnode;



Het bewaren van de laatste node moet je doen net voordat je een nieuwe listnode maakt.
"bewaarLaatsteNode = listNode;" moet dus net voor "listNode = listNode.nextNode;" aan het eind van je loop. Bij de eerste keer is hij null.

  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Thanx! kom net uit het ziekenhuis, weer proberen.

Ik ben malle Pietje niet.


  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Het gaat echter om een onbekend aantal Nodes, met de huidige techniek krijg ik de volgorde voor de eerste 3 wel goed. Maar steeds wanneer listNode = listNode.next plaatsvindt gaan de Nodes die ervoor staan verloren. Ik denk toch dat ik met een indexnummer aan de gang moet.

Ik ben malle Pietje niet.


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Alles is al genoemd om het werkend te krijgen.

Het duurt bij mijn PC erg lang voordat JBuilder is opgestart, daarom maar even in C.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int value;
    void *next;
} node;


#define len 5
node *buildList() {
    int values[len] = {4, 2, 3, 5, 1};

    node *start;
    node *current;
    node *next;

    int i;

    start = malloc(sizeof(node));

    current = start;
    next = start;
    for (i = 0; i < len - 1; i++) {
        (*current).value = values[i];
        next = malloc(sizeof(node));
        (*current).next = next;
        current = next;
    }
    (*next).value = values[len - 1];
    (*next).next = 0;

    return start;
}

void printList(node *l) {
    node *n;

    while (l) {
        n = (*l).next;
        printf("%d\n", (*l).value);
        l = n;
    }

}

void freeList(node *l) {
    node *n;

    while(l) {
        n = (*l).next;
        free(l);
        l = n;
    }
}


int main() {
    node *start = buildList();

    node *bewaarLaatsteNode;
    node *listNode;
    int swapped = 1;


    printf("before:\n");
    printList(start);

    while (swapped) {
        swapped = 0;
        bewaarLaatsteNode = 0;
        listNode = start;

        while ((*listNode).next) {
            if ((*listNode).value > (*((node *)(*listNode).next)).value) {
                if (bewaarLaatsteNode == 0) {
                    start = (*listNode).next;
                    (*listNode).next = (*((node *)(*listNode).next)).next;
                    (*start).next = listNode;
                }
                else {
                    (*bewaarLaatsteNode).next = (*listNode).next;
                    (*listNode).next = (*((node *)(*listNode).next)).next;
                    (*((node *)(*bewaarLaatsteNode).next)).next = listNode;
                }

                swapped = 1;
            }

            bewaarLaatsteNode = listNode;
            listNode = (*listNode).next;
        }

    }
    printf("after:\n");
    printList(start);

    freeList(start);
}

[ Voor 6% gewijzigd door Daos op 30-03-2005 19:37 ]

Pagina: 1