Avatar billede brops Nybegynder
08. maj 2006 - 13:12 Der er 8 kommentarer og
1 løsning

overskriver alle punkter i en arraylist

Jeg har en måde hvori jeg gemmer et objekt i en arraylist mit problem ligger i hver gang jeg gemmer et nyt objekt af samme type overskriver den alle værdierne i arraylisten

//intialisere min memory
private pathMemory ptMem = new pathMemory();


//gemmer en TSPløsning i vores løsnings liste
OurTSPSolution solution = twoOp.getSolution();
System.out.println( solution);
ptMem.addSolution(solution);

/**Metode til at gemme en løsning
*pathMemory er en arraylist
*/
public void addSolution(OurTSPSolution pSolution){
    pathMemory.add((OurTSPSolution)pSolution);
}

Jeg har mistanke til at det kun er en memory pointer jeg gemmer i arraylisten men hvordan kan jeg undgå dette.
Jeg har prøvet at bruge clone() men det har ikke ændret på noget

/brops
Avatar billede Slettet bruger
08. maj 2006 - 13:14 #1
Prøv at fjerne (OurTSPSolution) og bare add'e pSolution
Avatar billede arne_v Ekspert
08. maj 2006 - 13:20 #2
i C/C++ terminologi er alle Java referencer til objelter en pointer

så hvis du genbruger det samme objekt til at indsætte så ændrer du værdierne
i alle dine objekter i din ArrayList

du skal nok have en new et passende sted

eller du kan bruge clone hvis din OurTSPSolution klasse har en fornuftig clone
metode
Avatar billede brops Nybegynder
08. maj 2006 - 13:20 #3
har jeg prøvet det hjælper ikke det eneste det giver er at metoden er deprecation da men kan give objekter i java 5 en type når man adder dem til en arraylist
Avatar billede brops Nybegynder
08. maj 2006 - 13:39 #4
hmm Jeg sys jeg sætter solution hver gang jeg kommer der ind, her er hele metoden:

public void nextIteration(){
    TwoOpt twoOp = new TwoOpt();

    mIteration++;
    if(mIteration-1 < 5){
           
    if(isFirstRun){   

        twoOp.setInitialSolution(mConstruction);
        twoOp.setData(mData, mAfstMatrix);
        twoOp.solve();
        if(twoOp.isFinished()){
            mConstruction = twoOp.getSolution();
                   
            mSolution = mConstruction;
                   
            isFirstRun = false;
        }
               

    } else {
        twoOp.setInitialSolution(mConstruction);
        twoOp.setData(mData, mAfstMatrix);
        twoOp.solve();
        mSolution = twoOp.getSolution();
    }
    OurTSPSolution solution = new OurTSPSolution();
    solution = twoOp.getSolution();
    System.out.println( solution);
    ptMem.addSolution(solution);
    ptMem.printSolutions();

    } else {           
        mSolution = ptMem.getShortestSolution();
        mFinished = true;
    }
}
Avatar billede arne_v Ekspert
09. maj 2006 - 04:08 #5
OurTSPSolution solution = new OurTSPSolution();
    solution = twoOp.getSolution();

ser suspekt ud

hvis twoOp.getSolution() altid returnerer samme objekt så har du problemet

new OurTSPSolution() er spildt da du smider den væk med det samme i linien
nedenunder
Avatar billede brops Nybegynder
09. maj 2006 - 10:38 #6
twOp.getSolution();
returnere et nyt objekt hver gang (en ny løsning).

Men jeg skrev en cloneclass som har fået det til at virke nu, havde kun lavet en shallow clone før hen, fik det lavet om til en deepclone nu så det virker.

Smid et svar for dine råd hjalp mig meget i den rigtige retning :D
Avatar billede arne_v Ekspert
09. maj 2006 - 13:01 #7
ok
Avatar billede arne_v Ekspert
19. juni 2006 - 00:17 #8
så mangler du bare at acceptere
Avatar billede brops Nybegynder
02. oktober 2006 - 11:56 #9
Sorry har lige misset den :D
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