IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

ArrayList non mise à jour ?!


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut ArrayList non mise à jour ?!
    Bonsoir,

    Il y a un truc qui me semble étrange dans ce bout de code.
    La Arraylist result ne se remplit pas correctement : Au sein de la boucle, les éléments semblent bien être ajoutés, mais partout ailleurs dans le code, toutes ses cellules contiennent la même valeur...
    C'est d'autant plus louche, que, si par exemple, j'utilise un autre code pour la fonction step() (genre moins long) , tout fonctionne bien.

    Est ce que quelqu'un aurait une idée quant à cet étrangeté ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        public void trSimulate(Model model,  ArrayList<Double> time, ArrayList<Double[]> result, double t_start, double t_end ){
            Double[] newstates = new Double[model.getStates().length];
            newstates = model.getStates();
            double t = t_start;
            while(t<t_end) {
                time.add(t);
                result.add(newstates);
                System.out.println(newstates[1] + " - " + result.get(result.size()-1)[1]); // Ici result semble bien contenir les valeurs
                newstates = integrator.step(model, h);
                model.setStates(newstates);
                // one step increment
                t = t + h;
            }
     
            // Dès que je suis là, tous les éléments de result contiennent la même valeur ...
        }
    merci !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    c'est que vous avez mis la même instance de Double[] dans toutes les lignes, vous avez juste changé le contenu du tableau. Ca arrive si integrator.step(model, h) retourne toujours le même tableau avec un contenu différent. Assurez vous qu'il y a bien un new Double[] pour chaque itération (a priori, dans step)

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Merci pour cette indication.
    J'ai effectivement modifié la methode step() en question, pour y créer un new double à chaque appel.
    Cela n'a pour autant pas changé mes résultats.

    Je constate que, quoi que je fasse, sorti de la boucle while, tous mes éléments ont la même valeur : je dirai même que c'est la dernière valeur qui est mise partout...

    Any other idea ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par alefriedx Voir le message
    Merci pour cette indication.
    J'ai effectivement modifié la methode step() en question, pour y créer un new double à chaque appel.
    code svp

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public void trSimulate(Model model,  ArrayList<Double> time, ArrayList<Double[]> result, Double t_start, Double t_end ){
            Double t = t_start;
            while(t<t_end) {
                time.add(t);
                result.add(model.getStates());
                integrator.step(model, h);
                // one step increment
                t = t + h;
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
        public void step(Model model, Double h){
            int n = model.getStates().length;
            Double[] y = new Double[n];
            Double[] k =  new Double[n];
            Double[] q =  new Double[n];
            //initial states
            y = (model.getStates());
            for(int il = 0; il<n; il++){
                k[il] = 0.0;
                for(int ic = 0; ic<n; ic++){
                    k[il] += h*model.getEquilibrium()[il][ic]*y[ic];
                }
                // update y
                y[il] += 0.5*k[il];
            }
            // store k in q
            q = k;
            // new k
            for(int il = 0; il<n; il++){
                k[il] = 0.0;
                for(int ic = 0; ic<n; ic++){
                    k[il] += h*model.getEquilibrium()[il][ic]*y[ic];
                }
                // update y
                y[il] += cst1*(k[il] -q[il]);
                // update q
                q[il] = cst2 * k[il] + cst3 * q[il];
            }
            // new k
            for(int il = 0; il<n; il++){
                k[il] = 0.0;
                for(int ic = 0; ic<n; ic++){
                    k[il] += h*model.getEquilibrium()[il][ic]*y[ic];
                }
                // update y
                y[il] += cst4*(k[il] -q[il]);
                // update q
                q[il] = cst5 * k[il] + cst6 * q[il];
            }
            // new k
            for(int il = 0; il<n; il++){
                k[il] = 0.0;
                for(int ic = 0; ic<n; ic++){
                    k[il] += h*model.getEquilibrium()[il][ic]*y[ic];
                }
                // update y
                y[il] += k[il] / 6.0  - q[il] / 3.0;
            }
            model.setStates(y);
        }

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            y = (model.getStates());
            //........
            model.setStates(y);
    cherchez pas midi a 14 heures, vous continuez de travailler sur le meme tableau. en fait, l'appel à setState ne sert même a rien puisque vous avez modifié l'état interne directement dans le code.

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Oh, joie !

    D'accord, c'est en fait le signe = qui est plus subtil que ce que je pensais !

    Dans mon autre methode step (celle qui marche) je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Double[] result = new Double[n];
            for(int il = 0; il<n; il++){
                result[il] = model.getStates()[il];
                for(int ic = 0; ic<n; ic++){
                    result[il] += h*model.getEquilibrium()[il][ic]*model.getStates()[ic];
                }
            }
    Ce qui effectue une copie de l'élément model.getStates()[il]; dans result[il]

    alors que là, je passe une référence à mon tableau model.getStates()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    y = model.getStates();
    donc, je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    y = model.getStates().clone;
    ce qui me fait une copie de travail de mon tableau, que je met à jour à la fin ...

    merci mille fois tchize_ pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. updateRow() : Données non mises à jour
    Par Neuromancien2 dans le forum JDBC
    Réponses: 5
    Dernier message: 23/10/2008, 00h02
  2. [JpGraph] image non mise à jour
    Par Lyna31 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 14/03/2007, 16h07
  3. Réponses: 7
    Dernier message: 15/01/2007, 18h18
  4. Vue non mise à jour après modification d'une table
    Par cybernet35 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2006, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo