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

avec Java Discussion :

Récupération valeur sur un Iterator


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Par défaut Récupération valeur sur un Iterator
    Bonjour,

    débutant en Java, je travaille sur les sources d'un projet pour lequel la génération de classes Java à partir de fichier XSD (modifié) a eu un impact sur d'autres classes.

    Sur l'une d'elle, il y a une boucle via un "iterator". Je n'arrive pas à récupérer les données de cette boucle :
    Nom : code_iterator.JPG
Affichages : 868
Taille : 37,7 Ko
    Le méthode "getCeinf..." retourne bien une list. J'ai tenté de modifier l'iterator par une boucle "for : " mais cela ne fonctionne pas, un message sous Eclipse m'informe que je peux boucler uniquement sur un tableau.

    Comment récupérer les éléments présents dans ElementData ?

    Merci pour l'aide que vous pourrez m'apporter.

    Cdlt,

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Mets-nous ton code (entre balises [code][/code] — bouton ), parce qu'avec une copie d'écran c'est diffiicle de saisir tout le code.

    Tout ce que que je vois

    • c'est que tu as une ligne incompilable (if ( instanceof ...) ;
    • que tu devrais typer ton Iteror (Iterator<Le nom de la classe>) ce qui te permettra de récupérer la valeur à chaque itération sans caster (et probablement supprimer ce instanceof) ;
    • qu'il manque visiblement la récupération de la valeur : valeur = document.next().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Par défaut
    Bonjour et merci.

    J'avais mis une capture d'écran pour indiquer les valeurs que je souhaite avoir.

    Le code de la boucle en lui-même est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (final Iterator document = pPli.getCeinfformAndCoeinfformAndCeinfE101E102().iterator(); document.hasNext();) {
          if (document.next() instanceof CeinfformImpl){ // le instaceof me permet de savoir sur quel modèle je vais travailler
        	  // chargement du bon modèle en fonction du test ci-dessus
              MarshallerFactory.getUnloadingStandard(fr.cnamts.esope.Constantes.NO_MODELE_ESOPE_DETACHEMENT_CEINFFORM).marshal(document.next(), pNormeEsopeWriter, pMarshallerPostProcessor);
         }
    }
    Ce code est le code d'origine, je n'ai rien touché. La différence se situe sur la méthode getCeinfformAndCoeinfformAndCeinfE101E102 dans la classe Pli. Elle retourne une liste.

    Merci.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ok.

    1. Tu ne peux pas écrire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       if (document.next() instanceof CeinfformImpl){ // le instaceof me permet de savoir sur quel modèle je vais travailler
          	  // chargement du bon modèle en fonction du test ci-dessus
                MarshallerFactory.getUnloadingStandard(fr.cnamts.esope.Constantes.NO_MODELE_ESOPE_DETACHEMENT_CEINFFORM).marshal(document.next(), pNormeEsopeWriter, pMarshallerPostProcessor);
           }
      next() consomme la valeur, donc le second lira le suivant, s'il existe (tu obtiendras une NoSuchElementException à la fin de l'itération)
    2. Soit tu utilises une variable locale :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Object next = document.next();
      if ( next instanceof CeinfformImpl ) ...
      Soit tu types ton iterator :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      for (final Iterator<CeinfformImpl> document = pPli.getCeinfformAndCoeinfformAndCeinfE101E102().iterator(); document.hasNext();) {
      CeinfformImpl cell = document.next();
      Il te faudra peut-être typer la liste dont tu demandes l'iterateur (on pourrait caster, mais c'est toujours mieux de typer en avant, ça évite toute interprétation en aval et tout risque d'erreur, et ça simplifie le code (plus de cast et de instanceof). D'ailleurs, quand je vois CeinfformImpl, je pense implémentation, donc interface, donc il peut être judicieux de typer par l'interface (toujours typer au plus générique).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Par défaut
    Il n'y a rien qui va...
    Si je tente de typer l'iterator, j'ai cette erreur sous Eclipse :
    The type Iterator is not generic; it cannot be parameterized with arguments <CeinfformImpl>
    Si je tente avec la création de la variable, ça plante, il ne rentre même pas dans le test en mode debug.

    Pour info, le code d'origine (avant modification du XSD générant des classes), la boucle était de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (final Iterator iteratorDocument = pPli.getNomDuModele().iterator(); iteratorDocument.hasNext();) {
          MarshallerFactory.getUnloadingStandard(fr.cnamts.esope.Constantes.NO_MODELE_LIE_AU_NOM_DU_MODELE).marshal(iteratorDocument.next(), pNormeEsopeWriter, pMarshallerPostProcessor);
    }
    Dans la classe Pli, nous avions autant de méthodes que de modèles possibles. Sauf que désormais, nous n'avons plus qu'une seule méthode qui retourne une liste contenant tout ces modèles.

    Si ça peut te permettre d'y voir un peu plus claire. Tout détaillé serait très long et très compliqué, je te résume le principal. Je continue de chercher de mon côté.

    Merci.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nicomes371 Voir le message
    Il n'y a rien qui va...
    Si je tente de typer l'iterator, j'ai cette erreur sous Eclipse :
    The type Iterator is not generic; it cannot be parameterized with arguments <CeinfformImpl>
    C'est que la liste n'est pas typée. C'est pour ça que j'ai dit :
    Citation Envoyé par joel.drigo Voir le message
    O
    Il te faudra peut-être typer la liste dont tu demandes l'iterateur (on pourrait caster, mais c'est toujours mieux de typer en avant, ça évite toute interprétation en aval et tout risque d'erreur, et ça simplifie le code (plus de cast et de instanceof).
    Citation Envoyé par nicomes371 Voir le message
    Si je tente avec la création de la variable, ça plante, il ne rentre même pas dans le test en mode debug.
    Quoi plante ? Quel code ? Comment (message d'erreur ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object next = document.next();
    if ( next instanceof CeinfformImpl ) ...
    Ce code n'a aucune raison de planter (sauf si tu as déjà une variable next dans le scope, auquel cas, il suffit de changer son nom).


    Citation Envoyé par nicomes371 Voir le message
    Pour info, le code d'origine (avant modification du XSD générant des classes), la boucle était de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (final Iterator iteratorDocument = pPli.getNomDuModele().iterator(); iteratorDocument.hasNext();) {
          MarshallerFactory.getUnloadingStandard(fr.cnamts.esope.Constantes.NO_MODELE_LIE_AU_NOM_DU_MODELE).marshal(iteratorDocument.next(), pNormeEsopeWriter, pMarshallerPostProcessor);
    }
    En gros, tu as changé l'itérateur et il n'itère plus seulement sur des CeinfformImpl comme avant.
    Donc, si tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (final Iterator iteratorDocument = pPli.getCeinfformAndCoeinfformAndCeinfE101E102().iterator(); iteratorDocument.hasNext();) {
          Object next = iteratorDocument.next();
          if(  next instanceof CeinfformImpl ) {
               MarshallerFactory.getUnloadingStandard(fr.cnamts.esope.Constantes.NO_MODELE_LIE_AU_NOM_DU_MODELE).marshal(next, pNormeEsopeWriter,
     pMarshallerPostProcessor);
          }
    }
    ça devrait fonctionner. Sinon, ce n'est pas des instances de CeinfformImpl qui sont traitées par marshal.

    Au passage, le typage en Java, ce n'est pas un artifice esthétique ! Même marshal() prend de l'Object en premier argument !
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. [XL-2007] Récupération de valeur sur internet
    Par Eric_03 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/01/2010, 15h22
  2. récupération valeurs formulaire sur plusieurs pages?
    Par pod1978 dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2009, 16h02
  3. Récupération valeur sur une ligne
    Par marcello06 dans le forum Langage
    Réponses: 7
    Dernier message: 12/09/2008, 19h33
  4. récupération d'une valeur sur deux octets
    Par sanatou dans le forum C++
    Réponses: 6
    Dernier message: 09/01/2007, 16h35
  5. Récupération de la valeur sur clic d'un JDBtable
    Par tpdm dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 25/07/2006, 19h43

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