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

Langage Java Discussion :

initialisation des variable avec une boucle


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Points : 95
    Points
    95
    Par défaut initialisation des variable avec une boucle
    Bonjour à tous,
    J'ai un petit soucis et je sollicite votre aide.
    J'ai 2 classes, A et B. A contient des variables. Plusieurs instance de cet objet sont insérées dans un ArrayList . Dans la classe B, j'ai une méthode qui reçois cette liste (qui contient des instances de la classe A) en paramètre.
    Egalement dans la classe B, je fais des requetes dans la base et en bouclant sur le ResultSet, je dois initialiser des variables de la classe A en fonction des résultat retourné, dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while(rs.next()
    {
          for(int i = 0; i<al.size(); i++)
          {
                //Après avoir parcouru la liste à l'aide de l'Iterator
                A [i] variable1 = rs.getString(1);
                A [i] variable2 = rs.getInt(2);
                A [i] variable3 = rs.getInt(3);
                //etc. etc
           }
    }
    Je sais que l'on ne peut pas faire ça en Java, mais je ne sais pas comment faire
    Prouvez-vous m'aider SVP???
    merci infiniment

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    J'ai peut être mal compris, mais la solution n'est elle pas :
    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
    while(rs.next()
    {
          for(int i = 0; i<al.size(); i++)
          {
                //Après avoir parcouru la liste à l'aide de l'Iterator
                // Si les variables sont visibles
                A[i].variable1 = rs.getString(1);
                A[i].variable2 = rs.getInt(2);
                A[i].variable3 = rs.getInt(3);
                // Sinon (et c'est mieux)
                A[i].setVariable1(rs.getString(1));
                A[i].setVariable2(rs.getInt(2));
     
                //etc. etc
           }
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Je ne sais pas si d'autres ont réussi à comprendre, mais moi je ne trouve pas ça clair du tout. En fait tu as tellement épuré ton code que quand on arrive sur les instructions qui posent problème on ne sait pas ce que tu as déjà réussi à faire, et donc ce que tu essayes de faire exactement.

    "//Après avoir parcouru la liste à l'aide de l'Iterator" <== donc tu as réussi à parcourir la liste, tu as réussi à récupérer une instance de A ? je trouves un peu bizarre que tu parles d'Iterator alors que tu sembles boucler sur un index.
    Si tu n'as pas réussi à parcourir la liste, c'est comme ça qu'il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i = 0; i<al.size(); i++)
    {
    	A instanceDeA = (A)al.get(i);
    }
    ou comme ça, avec un Iterator :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Iterator it = al.iterator();
    while (it.hasNext())
    {
    	A instanceDeA = (A)it.next();
    }

    Après avoir récupéré chaque instance de A dans la liste, tu veux donc affecter les valeurs trouvées dans ton ResultSet aux variables contenues dans A. Ces "variables", ce sont tout simplement des champs de la classe A (dans ce cas je suppose que tu n'as pas de problème, hein) ou bien il y a une subtilité ?

    Petite remarque juste pour vérifier : je suppose qu'il y a un test dans la boucle for, afin certaines instances de A à mettre à jour, et que tu l'as supprimé du code pour simplifier ? parce que sinon, tu boucles sur rs, tu boucles sur al, et finalement tous les éléments de al ont été remplis avec les valeurs du dernier résultat uniquement

    Si je suis complètement à côté de la plaque, essaie de réexpliquer un peu ton problème

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Points : 95
    Points
    95
    Par défaut
    En fait, ma question est toute bête.
    Bon j'ai récupéré l'objet qui est dans ArrryaList. Il y plusieurs instance de la classe A dedans, disons une dizaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(i = 0; i<al.size(); i++)
    {
       for(Iterator it = al.iterator(); it.hasNext();)
      {
          A a = (A)al.get(i);
          while (rs.next())
         {
             a[i].var1 = rs.getXXX();
         }
      }
    }
    Donc c'est le code en rouge qui me pose des probs. Ma quetion est donc toute simple, Est-ce que , en JAVA, on peut initialiser une variable directement comme ça, car en VB c'est possible. Les variables dans A sont public et la liste ne contient que les objets de type A.
    Merci de vos suggestions

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Bonjour,
    Les deux boucles for sont identiques, pourquoi boucler 2 fois sur un même élément ?
    Hormis le [i] en trop, je ne vois pas ce qui pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(i = 0; i<al.size(); i++)
    {
          A a = (A)al.get(i);
          while (rs.next())
         {
             a.var1 = rs.getXXX();
         }
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(Iterator it = al.iterator(); it.hasNext();)
    {
          A a = (A)it.next();
          while (rs.next())
         {
             a.var1 = rs.getXXX();
         }
    }
    A noter que comme le dis Astartee, tu as un problème de boucle entre la liste et le resultset : Seul le premier élément de la liste sera modifié, et contiendra le dernier résultat du résultset.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Points : 95
    Points
    95
    Par défaut
    Désolé, j'ai oublié de préciser que j'ai un "break" juste avant la fin de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Iterator it = al.iterator(); it.hasNext();)
    {
         break;
    }
    pour l'obliger à passer dans la 1e boucle c'est à dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(i = 0; i<al.size(); i++)
    {
       for(Iterator it = al.iterator(); it.hasNext();)
       {
          while (rs.next()
          {
              .....
          }
          break;
       }
    }

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Ton code me perturbe.

    Déjà, tu effectues deux fois le parcours de la liste al (une fois avec l'index i, une fois avec l'itérateur it), et tu n'utilises jamais l'itérateur it (donc la deuxième boucle ne sert qu'à répéter les actions suivantes : récupérer le i-ième élément de al, parcourir rs...).
    Les deux méthodes que j'ai données sont équivalentes (sauf niveau perf, l'itérateur devrait être plus efficace il me semble). Il ne faut pas les utiliser les deux à la fois.

    Ensuite, en Java, la syntaxe "a[i]" sert à "lire le i-ième élément du tableau a".
    Ici l'objet a est une instance de la classe A, pas un tableau, donc la syntaxe n'est évidemment pas la bonne. Mais même en imaginant que a ait une structure de tableau, je ne vois vraiment pas pourquoi tu utilises l'indice i, qui représente la position de a dans la liste al, pour accéder à l'intérieur de a : il n'y a pas de rapport entre la position de l'objet dans une liste et sa structure interne. Je ne comprends donc pas du tout ce que tu cherches à faire sur cette ligne...
    Que signifie, pour toi, le "a[i]" ?


    Ça ne va sans doute pas correspondre à ce que tu cherches à faire, mais voici un exemple de code correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    List al = ...;
    for (i = 0; i<al.size(); i++)
    {
       A a = (A)al.get(i);
       ResultSet rs = ...;
       if (rs.next()) {
          a.var1 = rs.getXXX();
       }
    }
    Dans ce code :
    - je parcours la liste al
    - pour chaque élément, j'effectue une requête en base
    - je stocke une des valeur récupérée en base dans le champ var1 de l'élément a
    Différences avec ton code :
    - je ne parcours al qu'une fois : pourquoi est-ce que toi tu parcours encore une fois la liste (boucle avec l'itérateur) pour chaque élément ?
    - je ne parcours pas tous les résultats retournés dans le ResultSet, parce que dans mon code remplacer le if par un while reviendrait à écraser à chaque fois la valeur de var1 pour ne garder que la valeur correspondant au dernier résultat ; moi je ne prends que le premier résultat, voilà, si je voulais le dernier je n'aurais qu'à inverser l'ordre de tri des lignes extraites de la base
    - et puis, la grande différence : il n'y a pas ce énigmatique "a[i]" dont je me demande bien ce qu'il représente...


    EDIT : oups, le temps que j'écrive mon message, deux autres sont apparus
    Enfin, la question persiste : que signifie le a[i] ?
    Et puis : même avec un break la boucle avec l'itérateur est complètement inutile (sauf que, ouf, tu n'y passes plus qu'une seule fois au lieu de n fois)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Dans ce cas, pour la question de départ, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet.maVariable = uneValeur;
    Sinon, pour les autres problèmes, il faudra poster le code complet, parceque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Iterator it = al.iterator(); it.hasNext()
    {
    break;
    }
    ne sert strictement à rien, et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = 0; i<al.size(); i++)
    {
    for(Iterator it = al.iterator(); it.hasNext()
    {
    éxécute 2 fois la même boucle.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Points : 95
    Points
    95
    Par défaut
    Merci Astartee de ta réponse. C'est vrai que j'ai l'air de bien m'enliser dans la boue avec mon code. Ta suggestion semble être plus simple et efficace. Je vais l'essaiyer et j'en donnerai des nouvelles.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Points : 95
    Points
    95
    Par défaut
    Bonjour et merci à vos explication. Effectivement ma 2e boucle ne servait à rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (int i = 0; i < al.size(); i++) {
                for (Iterator it = al.iterator(); it.hasNext();) {
                    A a= (A) al.get(i);
     
                    a.setXXX();
                    a.setXXX();
     
                    break;
                }
            }

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Points : 95
    Points
    95
    Par défaut
    oups, j'ai envoyé un message pas complet. La 2e bocle ne servait à rien, mais ramarquez que le résultat avec 1 seule ou 2 boucle était le meme.
    Pour ma question de départ, je m'était embrouillé entre int et Integer. Comme je bosse avec java 1.4, l'autoboxing ne marchait pas.
    Merci encore à vos éclaircissements

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

Discussions similaires

  1. Afectation des variables dans une boucle
    Par Yoni Lebene dans le forum Delphi
    Réponses: 3
    Dernier message: 05/01/2007, 18h52
  2. Générer des variables avec une boucle
    Par Anamelech dans le forum Delphi
    Réponses: 15
    Dernier message: 03/11/2006, 12h33
  3. Reproduire des controles avec une boucle
    Par paradeofphp dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/06/2006, 11h46
  4. [MySQL] Traitement des variables d'une boucle for
    Par liryc78 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/03/2006, 20h53
  5. Generer des noms de variables avec une boucle
    Par moutanakid dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/07/2004, 17h45

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