Avatar billede ABCit Juniormester
17. august 2015 - 13:48 Der er 10 kommentarer og
1 løsning

Java - manipulering af felt i dataobjekt

Jeg har problemer med nedenstående. Må man ikke på denne måde manipulere et felt i et dataobjekt?

//Der itereres over den sorterede liste
for (Iterator<Koeb> i = Liste.iterator(); i.hasNext(); ) {
    AA.BB.Koeb koeb = (AA.BB.Koeb)i.next();
    String typeKoeb = koeb.getTypeKoeb();
    double andelKoebP1 = koeb.getAndelKoebP1();
    double andelKoebP2 = koeb.getAndelKoebP2();           
    double antalKoeb = koeb.getAntalKoeb();   
    if (andelKoebP1 > 0.0){ 
        double antalKoebP1 = antalKoeb * andelKoebP1; 
        koeb.setantalKoeb(antalKoebP1);
        //Det modificerede køb for person 1 placeres i en ny              //LinkedList for person 1
        beholdningP1.add(koeb);                   
        //Efter at det modificerede køb (købsobjekt) er brugt til at         //danne købsliste for person 1 sættes købsobjektet med de             //oprindelige værdier igen
        //Fordi det oprindelige købsobjekt skal anvendes igen til             //person 2
        koeb.setantalKoeb(antalKoeb);
    }
Avatar billede thomaskleist Nybegynder
17. august 2015 - 14:07 #1
Nej det kan ikke lade sige gøre. Hvis du omringer din loop med en try catch vil du få en ConcurrentModificationException. Du kan lave en synchronizedList()  og låse listen imens du iterate over den
Avatar billede arne_v Ekspert
17. august 2015 - 19:11 #2
#1

Umiddelbart kan jeg ikke se at listen forsoeges modificeret.
Avatar billede arne_v Ekspert
17. august 2015 - 19:15 #3
#0

Du skriver ikke havd dit problem er.

Men skulle jeg gaette saa tror jeg at det er at objekterne i beholdningP1 indeholder de forkerte data.

Og det skyldes at lister ikke indeholder objekter men referancer til objekter saa de to lister indeholder referance til samme objekter.

Maaske kan du bare klone dit objekt inden du indsaetter i beholdningP1.

Maaske skal du redesigne lidt.
Avatar billede ABCit Juniormester
18. august 2015 - 14:13 #4
Det lyder som om jeg har misforstået noget. Jeg har opfattet listen beholdningP1 som en liste indeholdende nye objekter af (koeb), hvor jeg blot har ændret værdien i feltet antalKoeb. Men hvis listen kun består af referencer til de oprindelige objekter, er det faktisk disse som jeg ændrer værdierne i hvilket jo nok giver problemer. Måske jeg skulle tilføje en nyt felt på objektet (i XSD filen) som kan sættes med den beregnede værdi /nye værdi i stedet for at klone listen - eller er dette en dårlig tilgang?
Avatar billede ABCit Juniormester
19. august 2015 - 07:54 #5
Det lyder som om jeg har misforstået noget. Jeg har opfattet listen beholdningP1 som en liste indeholdende nye objekter af (koeb), hvor jeg blot har ændret værdien i feltet antalKoeb. Men hvis listen kun består af referencer til de oprindelige objekter, er det faktisk disse som jeg ændrer værdierne i hvilket jo nok giver problemer. Måske jeg skulle tilføje en nyt felt på objektet (i XSD filen) som kan sættes med den beregnede værdi /nye værdi i stedet for at klone listen - eller er dette en dårlig tilgang?
Avatar billede arne_v Ekspert
19. august 2015 - 16:35 #6
Jeg kender jo ikke din problem stilling, men umiddelbart ville jeg forsoege mig med:

- eksisterende felter
- en ekstra getter som beregner den modficerede vaerdi
Avatar billede ABCit Juniormester
20. august 2015 - 08:19 #7
Tror ikke at jeg helt forstår - kan du give et eks.?
Avatar billede arne_v Ekspert
20. august 2015 - 19:20 #8
Noget a la:


public class Koeb {
    // base fields
    private int antalKoeb;
    private double andelKoebP1;
    private double andelKoebP2;
    // constructor
    public Koeb(int antalKoeb, double andelKoebP1, double andelKoebP2) {
        this.antalKoeb = antalKoeb;
        this.andelKoebP1 = andelKoebP1;
        this.andelKoebP2 = andelKoebP2;
    }
    // normal getters and setters
    public int getAntalKoeb() {
        return antalKoeb;
    }
    public void setAntalKoeb(int antalKoeb) {
        this.antalKoeb = antalKoeb;
    }
    public double getAndelKoebP1() {
        return andelKoebP1;
    }
    public void setAndelKoebP1(double andelKoebP1) {
        this.andelKoebP1 = andelKoebP1;
    }
    public double getAndelKoebP2() {
        return andelKoebP2;
    }
    public void setAndelKoebP2(double andelKoebP2) {
        this.andelKoebP2 = andelKoebP2;
    }
    // extra getters
    public int getAntalKoebP1() {
        return (int)(andelKoebP1 * antalKoeb);
    }
    public int getAntalKoebP2() {
        return (int)(andelKoebP2 * antalKoeb);
    }
}
Avatar billede ABCit Juniormester
21. august 2015 - 08:02 #9
Takker:-)
Avatar billede ABCit Juniormester
21. august 2015 - 08:03 #10
Hvordan giver jeg point?
Avatar billede arne_v Ekspert
21. august 2015 - 20:13 #11
Jeg skal smide et svar.

:-)
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

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





CIO
Stort CIO-interview: Lemvigh-Müllers milliard-omsætning er blevet digital