Avatar billede bonebreaker Nybegynder
07. december 2004 - 13:27 Der er 5 kommentarer og
1 løsning

Arraylist, Rekursivt kald & Overskrivelse

Jeg sidder nu og laver lidt komponenttest på et af mine rekursive kald. Kaldet som sådan virker fint nok, da den opretter det rigtige antal objekter, dog er der en lille hage ved det. Når jeg debugger ser det pt ud som den overskriver værdien i de tidligere oprettede objekters attributter. Dette sker dog kun i hashtables attributterne og ikke i hverken float eller int attributterne. Nogen der har en umiddelbar løsning.

        private static void genererKombination(int intArrayTaeller, Hashtable hatVarerAntal, Hashtable hatTilbudAntal, float floRabat, float floNormalPris){
           
            int arrayTaeller = intArrayTaeller;
            Hashtable tmpVarerAntal = new Hashtable();
            Hashtable tmpTilbudAntal = new Hashtable();
           
            if(floNormalPris <= floMaxvaerdi){
                arlAlleKombinationer.add(new ent_Tilbudskombination((intKombinationsNr), floNormalPris, floRabat, hatVarerAntal, hatTilbudAntal));
               
                while(arrayTaeller < arrStartTilbud.length){
                    genererKombination(arrayTaeller, laegHashSammen(hatVarerAntal, arrStartTilbud[arrayTaeller].getHatVarerAntal()), laegTilHash(hatTilbudAntal, arrStartTilbud[arrayTaeller].getIntTilbudsNr(), 1), (floRabat + arrStartTilbud[arrayTaeller].getFloRabat()), (floNormalPris + arrStartTilbud[arrayTaeller].getFloNormalpris()) );
                    arrayTaeller++;
                }
            }
        }

         
        private static Hashtable laegTilHash(Hashtable hatHashtable, int intKey, int intAntal)
        {
            if ( hatHashtable.containsKey((Object) ("" + intKey) ) ){
                hatHashtable.put( ((Object) ("" + intKey)), (Object) ("" + ( (Integer.parseInt( (hatHashtable.get((Object) ("" + intKey)).toString())) + intAntal))));
            }
            else
            {
                hatHashtable.put( ((Object) ("" + intKey)), (Object) ("" + intAntal) );
            }
                       
            return hatHashtable;
        }
       
        private static Hashtable laegHashSammen(Hashtable hatSummeringsHashtable, Hashtable hatAdderingsHashtable){
            Enumeration enuAdderingsHashtable = hatAdderingsHashtable.keys();
            while (enuAdderingsHashtable.hasMoreElements()){
                Object tmpAdderingsObject = enuAdderingsHashtable.nextElement();
                if (hatSummeringsHashtable.containsKey(tmpAdderingsObject)){
                    hatSummeringsHashtable.put(tmpAdderingsObject, (Object) ("" + (Integer.parseInt(hatSummeringsHashtable.get(tmpAdderingsObject).toString()) + Integer.parseInt(hatAdderingsHashtable.get(tmpAdderingsObject).toString()))));
                }
                else
                {
                    hatSummeringsHashtable.put(tmpAdderingsObject, hatAdderingsHashtable.get(tmpAdderingsObject));
                }
            }
            return hatSummeringsHashtable;
        }       


Hvis i har brug for mere kode må i sige til
Avatar billede bonebreaker Nybegynder
07. december 2004 - 13:39 #1
Har lige en mindre rettelse....

        private static void genererKombination(int intArrayTaeller, Hashtable hatVarerAntal, Hashtable hatTilbudAntal, float floRabat, float floNormalPris){
           
            int arrayTaeller = intArrayTaeller;
            float normalPris = floNormalPris;
            Hashtable tmpVarerAntal = new Hashtable();
            Hashtable tmpTilbudAntal = new Hashtable();
           
            if(normalPris <= floMaxvaerdi){
                float rabat = floRabat;
                tmpVarerAntal.clear();
                tmpTilbudAntal.clear();
                tmpVarerAntal = hatVarerAntal;
                tmpTilbudAntal = hatTilbudAntal;
               
                arlAlleKombinationer.add(new ent_Tilbudskombination(normalPris, rabat, tmpVarerAntal, tmpTilbudAntal));
               
                while(arrayTaeller < arrStartTilbud.length){
                    genererKombination(arrayTaeller, laegHashSammen(hatVarerAntal, arrStartTilbud[arrayTaeller].getHatVarerAntal()), laegTilHash(hatTilbudAntal, arrStartTilbud[arrayTaeller].getIntTilbudsNr(), 1), (rabat + arrStartTilbud[arrayTaeller].getFloRabat()), (normalPris + arrStartTilbud[arrayTaeller].getFloNormalpris()) );
                    arrayTaeller++;
                }
            }
        }

men den laver stadig samme nummer
Avatar billede agrezz Nybegynder
07. december 2004 - 13:47 #2
ku det tænkes at det du ligge ind, hele tiden har samme hash key..? så er det jo klart den overskriver..
Avatar billede bonebreaker Nybegynder
07. december 2004 - 14:04 #3
Jeg opretter jo en ny Hashtable hver gang funktionen kører, så den burde jo ikke overskrive hvad jeg har lagt i tidligere objekter. Problemet er at alle de objekter jeg har tilføjet til min arraylist bliver ændret
Avatar billede arne_v Ekspert
07. december 2004 - 22:36 #4
En Hashtable overskriver ikke fordi noget har samme hash key. Performance er
bare ikke optimal.
Avatar billede arne_v Ekspert
07. december 2004 - 22:38 #5
Men ellers kan jeg slet ikke gennemskue koden.
Avatar billede bonebreaker Nybegynder
08. december 2004 - 12:08 #6
Løsning fundet. Cloning af hashtable løser mit problem.
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