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

Android Discussion :

je n'arrive à extraire un élément d'un ArrayList j'obtiens toujours le dernier élément


Sujet :

Android

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut je n'arrive à extraire un élément d'un ArrayList j'obtiens toujours le dernier élément
    Bonjour

    j'ai créé une classe Donne :
    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
     
    public class Donne {
     
        //proprietes
        private  static Integer numeroDonne;
        private static String donneur;
        private static String vulnerable;
     
        public Donne(Integer numeroDonne, String donneur, String vulnerable) {
            this.numeroDonne = numeroDonne;
            this.donneur = donneur;
            this.vulnerable = vulnerable;
        }
     
        public String getVulnerable() {
            return vulnerable;
        }
        public  void setVulnerable(String vulnerable) {
            Donne.vulnerable = vulnerable;
        }
        public String getDonneur() {
            return donneur;
        }
        public  void setDonneur(String donneur) {
            Donne.donneur = donneur;
        }
        public Integer getNumeroDonne() {
            return numeroDonne;
        }
        public static void setNumeroDonne(Integer numeroDonne) {
            Donne.numeroDonne = numeroDonne;
        }
    }
    je crée une ArrayList de plusieurs donnes dans une classe Mouvement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public static ArrayList<Donne> lesDonnesMouvement;
        public static ArrayList<Donne> getLesDonnesMouvement() {
            return lesDonnesMouvement;
        }
        public static void setLesDonnesMouvement(ArrayList<Donne> lesDonnesMouvement) {
            Mouvement.lesDonnesMouvement = lesDonnesMouvement;
        }
    Dans la classe Controle j'extrait les donnes d'un JsonArray :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
       public void afficheTournoi(String strMessage1, String strMessage2){
     
            try {
                //transforme les données de message1 en un tableau : leMouvement
                JSONArray leMouvementJsonArray = new JSONArray(strMessage1);
                Log.d("controle.affiTourn", "le mvnt_numero "+leMouvementJsonArray.toString());
                for (int k = 0; k < leMouvementJsonArray.length(); k++) {
                    JSONObject leMouvement = new JSONObject(leMouvementJsonArray.get(k).toString());
                    mvnt_numero = leMouvement.getInt("mvnt_numero");
                    Mouvement.setMvnt_numero(mvnt_numero);
                    table_numero = leMouvement.getInt("table_numero");
                    Mouvement.setTable_numero(table_numero);
                    equipeNS = leMouvement.getInt("equipe_NS");
                    Mouvement.setEquipeNS(equipeNS);
                    equipeEO = leMouvement.getInt("equipe_EO");
                    Mouvement.setEquipeEO(equipeEO);
                    nomJ1 = leMouvement.getString("nomJ1");
                    Tournoi.setNomJ1(nomJ1);
                    prenomJ1 = leMouvement.getString("prenomJ1");
                    Tournoi.setPrenomJ1(prenomJ1);
                    nomJ2 = leMouvement.getString("nomJ2");
                    Tournoi.setNomJ2(nomJ2);
                    prenomJ2 = leMouvement.getString("prenomJ2");
                    Tournoi.setPrenomJ2(prenomJ2);
                }
            } catch (JSONException e) {
                Log.d("controle", "***************" + "conversion JSON impossible " + e.toString());
                // e.printStackTrace();
            }
            try {
                //transforme les données de message2 en un tableau : leMouvement
                JSONArray lesDonnesMouvementJsonArray = new JSONArray(strMessage2);
                Log.d("controle.affiTourn", "les donnes du Mouvemengt "+ lesDonnesMouvementJsonArray.toString());
                for (int k = 0; k < lesDonnesMouvementJsonArray.length(); k++) {
                    JSONObject donneMouvementOject = new JSONObject(lesDonnesMouvementJsonArray.get(k).toString());
     
                    numeroDonne = donneMouvementOject.getInt("numero_donne");
                    donneur = donneMouvementOject.getString("donneur");
                    vulnerable = donneMouvementOject.getString("vulnerable");
                    //crée une donne du mouvement
                    Donne donneMouvement = new Donne(numeroDonne, donneur, vulnerable);
                    Log.d("control.affich","une donne du mouvement index : "+k+" ** "+donneMouvement+" ***numeroDonne : "+numeroDonne);
                    Integer numero3Donne = donneMouvement.getNumeroDonne();
                    Log.d("control.affich","une donne du mouvement index : "+k+" ** "+donneMouvement+" ***numero3Donne : "+numero3Donne);
     
                    //ajoute les donnes à la liste des donnes du Mouvement
                    lesDonnesMouvement.add(donneMouvement);
                    Mouvement.setLesDonnesMouvement(lesDonnesMouvement);
                    Integer numero0Donne = lesDonnesMouvement.get(0).getNumeroDonne();
                    Log.d("control.affich","une donne du mouvement index : "+k+" ** "+donneMouvement+" **numero0Donne : "+numero0Donne);
                    Donne donne0 = lesDonnesMouvement.get(0);
                    Integer numero0 = donne0.getNumeroDonne();
                    Log.d("control.affich","une donne0 du mouvement index : "+0+" ** "+donne0+" **numero0 : "+numero0);
                }
            } catch (JSONException e) {
                Log.d("controle", "***************" + "conversion JSON impossible " + e.toString());
                // e.printStackTrace();
            }
     
            Log.d("control.affich", "mouvement.getdonne a jouer : "+Mouvement.getDonneAJouer());
            if(Mouvement.getDonneAJouer()!=0){
                Mouvement.setDonneAJouer(Mouvement.getDonneAJouer()+1); ;
            }
            Log.d("control.affich", "mouvement.getdonne a jouer : "+Mouvement.getDonneAJouer());
            lesDonnesMouvement = Mouvement.getLesDonnesMouvement();
            Log.d("control.affichetour","lesDonnesMouvements : "+lesDonnesMouvement.toString());
     
            for (int k = 0; k < lesDonnesMouvement.size(); k++) {
                Integer numero2Donne = lesDonnesMouvement.get(k).getNumeroDonne();
                Log.d("control.affichetour", "numero2Donne : " + numero2Donne.toString());
                Donne uneDonne = Mouvement.getUneDonneMouvement( k);
                Integer numero5Donne = uneDonne.getNumeroDonne();
                Log.d("control.affichetour", "numero5Donne : " + numero5Donne.toString());
            }
            Mouvement.setDonneAJouer(numeroDonne);
     
                Intent intent = new Intent(contexte, MouvementActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                Log.d("controle.affiTourn", "le mvnt_numero => MouvementActivity");
                contexte.startActivity(intent);
        }
    Le problème je n'arrive pas à avoir le numéro de la première donne de l'arrayList "lesDonnesMouvement", une fois l'arraylist constitué, j'obtiens toujours le numéro de la dernière donne enregistrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //rappel du code ci-dessus
            for (int k = 0; k < lesDonnesMouvement.size(); k++) {
                Integer numero2Donne = lesDonnesMouvement.get(k).getNumeroDonne();
                Log.d("control.affichetour", "numero2Donne : " + numero2Donne.toString());
                Donne uneDonne = Mouvement.getUneDonneMouvement( k);
                Integer numero5Donne = uneDonne.getNumeroDonne();
                Log.d("control.affichetour", "numero5Donne : " + numero5Donne.toString());
            }
    alors que lors de la création les numéro de la donne sont correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //rappel du code ci-dessus
               for (int k = 0; k < lesDonnesMouvementJsonArray.length(); k++) {
                    JSONObject donneMouvementOject = new JSONObject(lesDonnesMouvementJsonArray.get(k).toString());
                    numeroDonne = donneMouvementOject.getInt("numero_donne");
                    donneur = donneMouvementOject.getString("donneur");
                    vulnerable = donneMouvementOject.getString("vulnerable");
                    //crée une donne du mouvement
                    Donne donneMouvement = new Donne(numeroDonne, donneur, vulnerable);
                    Log.d("control.affich","une donne du mouvement index : "+k+" ** "+donneMouvement+" ***numeroDonne : "+numeroDonne);
                    Integer numero3Donne = donneMouvement.getNumeroDonne();
                    Log.d("control.affich","une donne du mouvement index : "+k+" ** "+donneMouvement+" ***numero3Donne : "+numero3Donne);
     
                    //ajoute les donnes à la liste des donnes du Mouvement
                    lesDonnesMouvement.add(donneMouvement);

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Du bridge!

    Ça tombe bien, j'adore ce jeu.

    Je n'ai pas fait d'Androïd depuis longtemps, mais des choses me semblent étranges.

    Pour commencer, les propriétés sont propre à la donne.

    Elles ne peuvent donc pas être static.

    Soit:
    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
     
    public class Donne {
     
        //proprietes
        private  final Integer numeroDonne;
        private final String donneur;
        private final String vulnerable;
     
        public Donne(Integer numeroDonne, String donneur, String vulnerable) {
            this.numeroDonne = numeroDonne;
            this.donneur = donneur;
            this.vulnerable = vulnerable;
        }
     
       //Getter seulement
    Mieux, toujours fonctionnellement parlant, on n'a pas n'importe quoi en joueur et team.
    Je propose d'utiliser les enums ( https://www.jmdoudoux.fr/java/dej/chap-enums.htm ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public enum Joueur{
      NORD,SUD,EST,OUEST;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public enum Equipe{
      NORD_SUD,EST_OUEST;
    }
    Ce qui donnerait:
    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
     
    public class Donne {
     
        //proprietes
        private  final Integer numeroDonne;
        private final Joueur donneur;
        private final Equipe vulnerable;
     
        public Donne(Integer numeroDonne, Joueur donneur, Equipe vulnerable) {
            this.numeroDonne = numeroDonne;
            this.donneur = donneur;
            this.vulnerable = vulnerable;
        }
     
       //Getter seulement
    Si on est en Java 17 ou +, je recommande d'utiliser les records ( https://www.jmdoudoux.fr/java/dej/chap-records.htm ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public record Donne(Integer numeroDonne, Joueur donneur, Equipe vulnerable){}
    Pour le mouvement, en utilisant les record:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public record Mouvement(List<Donne>lesDonnesMouvement){}
    Notez que j'utilise les interfaces (le contrat) et non les implémentations (ici, ArrayList).
    Là aussi, le static est un non sens.

    Je te laisse faire ta boucle, mais là aussi, je recommande l'iteration/for each.
    Soit par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(Donne donne:lesDonnesMouvement){
      //Par exemple, si on a des record, toString est de base redéfinie
      System.out.println(donne.toString());
    }
    Normalement, tu devrais voir la bonne donne au fur et à mesure.
    Pour le JSON,il existe des librairies:
    https://www.baeldung.com/java-org-json

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut
    Bonjour

    Merci pour ta réponse.
    Mieux, toujours fonctionnellement parlant, on n'a pas n'importe quoi en joueur et team.
    je ne vois pas bien ce que ça m'apporte ? le donneur et l'équipe c'est réglé.
    Notez que j'utilise les interfaces (le contrat) et non les implémentations (ici, ArrayList).
    Là aussi, le static est un non sens.
    je ne comprends les interfaces(le contrat) ?

    J'ai beaucoup recopié d'exemples qui fonctionnent pour ça que j'ai mis les "static" (sans trop bien comprendre les différences).

    Mais je crois que mon problème n'est pas là!

    Une fois l'ArrayList constitué normalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    uneDonne = lesMouvementsDonne.get(0);
    me donne bien la donne N° 0
    mais lorsque je veux extraire le numéro de "uneDonne"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    numeroDonne = uneDonne.getNumeroDonne ;
    ça me donne toujours le numéro de la dernière donne enregistrée dans l'Arraylist.

    c'est pour ça que dans mon code j'ai fait plein de Log.d à toutes les étapes pour voir les résultats.
    pendant la constitution de l'arrayList pas de problème mais si je veux extraire après l'arrayList toujours le problème.

    Je suis d'accord avec toi que mon code n'est pas très académique

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut
    Je viens de prendre le temps pour voir l'explication de "static"

    C'est une variable qui appartient à la classe et non à l'objet (instance).
    Les variables statiques ne sont initialisées qu'une seule fois, au début de l'exécution. Ces variables seront initialisées en premier, avant l'initialisation de toute variable d'instance.
    Une seule copie à partager par toutes les instances de la classe.
    Une variable statique est accessible directement par le nom de la classe et ne nécessite aucun objet.
    Syntaxe:Class.variable
    et moi c'est bien des variables de l'instance.

    je révise tout ça et je crois que ça devrait fonctionner.

  5. #5
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Je vais répondre à l'histoire de l'interface.

    Une bonne pratique de codage consiste au "masquage de l'information".
    C'est la loi de Demeter ( https://fr.wikipedia.org/wiki/Loi_de_D%C3%A9m%C3%A9ter )

    Une classe ne voit que les méthodes qu'elle peut appeler (les interfaces), elle ne doit en aucune façon voir l'implémentation des méthodes qu'elle est sensé appeler (implémenté dans une classe).

    Dans le cas ici, l'interface est List:
    https://docs.oracle.com/en/java/java...util/List.html

    L'implémentation utilisée est ArrayList (https://docs.oracle.com/en/java/java...ArrayList.html ) mais il y en a d'autres.

    Ainsi, le programme marche encore, si d'aventure on s'amuse à changer l'implémentation car le programme utilise le contrat (l'interface).

    De fait, il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<String> maListe = ....
    Plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList<String> maListe = ...

Discussions similaires

  1. Je n'arrive plus à extraire ma base de données en mysql console
    Par hamzawhy dans le forum Administration
    Réponses: 3
    Dernier message: 25/08/2012, 09h16
  2. Réponses: 6
    Dernier message: 26/05/2008, 20h23
  3. J'arrive pas à extraire le contenu de MSDN.rar !
    Par zentaf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/04/2007, 21h24
  4. Réponses: 2
    Dernier message: 10/07/2002, 11h51
  5. Réponses: 2
    Dernier message: 30/05/2002, 10h19

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