Avatar billede bhn.314 Nybegynder
23. maj 2001 - 18:27 Der er 5 kommentarer og
1 løsning

GarbageCollection

Vi har et begrebshierarki med node-objekter. Hvert node-objekt består af en tekststreng(der er begrebet), en parent ArrayList og en child ArrayList. ArrayListerne indeholder referencer til relaterede noder/begreber. Vi kan slette og indføre nye noder, dog kan der ikke indføres en node hvis den allerede findes.
Hvis vi så indfører en ny node/begreb og herefter sletter det, kan vi ikke oprette den samme node/begreb igen, forbi systemet melder at noden/begrebet allerede eksisterer.
Lyder det ikke som et problem med Garbage Collection ? Og hvordan løser vi det rent logisk ?
Avatar billede bhn.314 Nybegynder
23. maj 2001 - 18:28 #1
Hvordan Garbage Collectes et node-objekt ?
Avatar billede logical Nybegynder
23. maj 2001 - 18:37 #2
Referencer til garbage eligable objekter kan ikke genskabes (Ihvertfald sådan umiddelbart), så det kan ikke lade sig gøre at det er problemer med Garbage Collection.

Det er jeres kode, som ikke vil oprette fordi i formodentlig ikke har fået fjernet det gamle helt.

Vis noget kode omkring opret og slet, så kan det være vi kan se det.
Avatar billede bhn.314 Nybegynder
23. maj 2001 - 18:39 #3
public static String sletBegreb(){   
       
        System.out.println(\"Skriv begreb der skal slettes: \");
       
        String sletOrd = Tastatur.readString();
       
        Node y = rod.findNode(sletOrd);

        if(!y.emneOrd.equalsIgnoreCase(sletOrd)){
       
            System.out.print(\"Noden eksisterer ikke i hierarkiet.\");
            sletBegreb();
           
        }
       
        else if(y.emneOrd.equalsIgnoreCase(sletOrd)){
           
            rod.sletKnude(y);
        }

        return y.emneOrd;
    }
Avatar billede bhn.314 Nybegynder
23. maj 2001 - 18:41 #4
Den her er jo nok lidt mere relevant:-)

public void sletKnude(Node nodeDerSkalSlettes){
       
        ArrayList slettesBoern = nodeDerSkalSlettes.alBoern;
        ArrayList slettesForaeldre = nodeDerSkalSlettes.alForaeldre;
       
        //Henter \"den slettedes\" forældre
        for (int i = 0; i < slettesForaeldre.size(); i++){
           
            Node m = (Node) slettesForaeldre.get(i);
           
            //I disse forældres alBoern-array tilføjes alle \"den slettedes\" børn 
            for (int j = 0; j < slettesBoern.size(); j++){
                m.alBoern.add(slettesBoern.get(j));
            }
           
            //Forælderens reference til det \"gamle barn/de gamle børn\"
            // findes og slettes
           
            // Hvis denne forælder har børn ledes der.
            if (!m.alBoern.isEmpty()) {   
               
                // Forælderens arraylist med børn ledes igennem
                for (int i2 = 0; i2 < m.alBoern.size(); i2++)    {
                   
                    //Først oprettes midlertidig Node n med et barn fra arraylisten
                    Node m2 = (Node) m.alBoern.get(i2);
                   
                    // Hvis børnenodens emneord passer overens med n2\'s emneord
                    // fjernes referencen og noden erstattes med den reviderede
                    if (m2.emneOrd.equalsIgnoreCase(nodeDerSkalSlettes.emneOrd)) {
                       
                        m.alBoern.remove(i2);
                        i2--;                           
                    }               
                }
            }
        }
       
        //Henter \"den slettedes\" børn
        for (int k = 0; k < slettesBoern.size(); k++){
           
            //Først oprettes midlertidig Node n med et barn af \"den slettede\"
            Node n = (Node) slettesBoern.get(k);
           
            //I disse børns alForaeldre-array tilføjes alle \"den slettedes\" forældre 
            for (int l = 0; l < slettesForaeldre.size(); l++){
                n.alForaeldre.add(slettesForaeldre.get(l));
            }
           
            //Børnenes reference til den \"gamle forælder/de gamle forældre\"
            //findes og slettes
           
            // Hvis det barn vi kigger på har forældre ledes det igennem for \"den slettede\"
            if (!n.alForaeldre.isEmpty()) {   
               
                // Barnets arraylist med forældre ledes igennem
                for (int i2 = 0; i2 < n.alForaeldre.size(); i2++)    {
                   
                    //Først oprettes midlertidig Node n med den første forælder
                    Node n2 = (Node) n.alForaeldre.get(i2);   
                   
                    if (n2.emneOrd.equalsIgnoreCase(nodeDerSkalSlettes.emneOrd)) {
                            n.alForaeldre.remove(i2);
                            i2--;
                    }               
                }
            }       
        }
        System.out.println(\"Begrebet: \" + nodeDerSkalSlettes + \" er nu slettet.\");
        System.out.println(\"\\nTryk \'enter\' for at komme tilbage.\");
   
        //Venter på indtastning fra bruger
        String tilbage = Tastatur.readString();
       
        //Returnerer hvis brugeren trykker en tast
        if(tilbage.equalsIgnoreCase(\"\")||!tilbage.equalsIgnoreCase(\"\"))
            SamletMenuer.administratorMenu();
            Start.administrator();   
    }   
Avatar billede bhn.314 Nybegynder
23. maj 2001 - 18:44 #5
Der gives nu hele 65 point i stedet for 30 !!! :-)
Avatar billede logical Nybegynder
23. maj 2001 - 19:05 #6
public void sletKnude(Node nodeDerSkalSlettes){
       
        ArrayList slettesBoern = nodeDerSkalSlettes.alBoern;
        ArrayList slettesForaeldre = nodeDerSkalSlettes.alForaeldre;
       
        //Henter \"den slettedes\" forældre
        for (int i = 0; i < slettesForaeldre.size(); i++){
            Node m = (Node) slettesForaeldre.get(i);
            //I disse forældres alBoern-array tilføjes alle \"den slettedes\" børn 
            for (int j = 0; j < slettesBoern.size(); j++){
                m.alBoern.add(slettesBoern.get(j));
            }
           
Hertil kan jeg følge med, så knækker filmen...

Lad mig skrive forfra fra forløkken:
        //Henter \"den slettedes\" forældre
        for (int i = 0; i < slettesForaeldre.size(); i++){
            Node parent = (Node) slettesForaeldre.get(i);
            //I disse forældres alBoern-array tilføjes alle børn 
            for (int j = 0; j < slettesBoern.size(); j++){
                Node child = slettesBoern.get(j);
                parent.alBoern.add(child); // Add child to parent
                child.alForaeldre.add(parent); // add parent to child
                parent.alBoern.remove(nodeDerSkalSlettes); // remove me from parent
                child.alForaeldre.remove(nodeDerSkalSlettes); // remove me from child
            }
      }

Og så skulle det ligesom være det. Alt det andet kan jeg ikke lige se logikken i.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester