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

Struts 1 Java Discussion :

Doublons dans un DropDownBox


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 200
    Par défaut Doublons dans un DropDownBox
    Bien a vous,

    Ya t il un moyen d'eliminer les doublons dans une liste deroulante.
    dans la liste il ya pas mal de repetitions, je veux liste chaque element une seul fois
    voici mon morceau de code:

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <tr>
    <td>
          <html:select property="fsp_id">
           <html:options collection="statusAll" property="fsp_id"  />
          </html:select>
    </td>
    </tr>
    merci

  2. #2
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Bonjour,

    les Set permettent de supprimer les doublons

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    java.util.List liste = new java.util.ArrayList();
    liste.add("test");
    liste.add("test");
     
    System.out.println("avec doublon :"+liste);
     
    liste = new java.util.ArrayList(new java.util.HashSet(liste));
     
    System.out.println("sans doublon :"+liste);
    si cela peut aider.

  3. #3
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut


    tu dois le faire au moment où tu remplis ta collection.

    Donc, si tu la remplis avec une requête SQL, tu dois la faire de tel manière qu'elle supprime les doublons avec l'instruction DISTINCT ou GROUP BY par exemple

    Si ce n'est pas par SQL, il faut le faire à la main en recherchant si l'element que tu insères n'est pas déjà présent :
    exemple avec une list de type String :
    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
     
    // init des varaibles
    List<String> listDest = new ArrayList();
    List<String> listSrc = new ArrayList();
     
    // je remplie la liste source à la main pour avoir des infos à tester
    listSrc.add("toto");
    listSrc.add("titi");
    listSrc.add("tutu");
    listSrc.add("toto");
    listSrc.add("titi");
    listSrc.add("tutu");
     
    Iterator<String> it = listSrc.iterator();
    while(it.hasNext())
    {
       String sVal = it.next();
       if(listDest.indexOf(sVal) < 0)
          listDest.add(sVal);
    }
    Si tu stockes des objets qui ne sont pas de type basic comme String, int, etc ...
    il faut que tu override la fonction equals dans ta classe comme suit :
    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
     
    @Override
        public boolean equals(Object obj) {
     
            // Vérification de l'égalité des références
            if (obj == this) {
                return true;
            }
     
            // Vérification du type du paramètre
            if (obj instanceof TaClasse) {
     
                // Vérification des valeurs des attributs
            	TaClasse other = (TaClasse) obj;
     
            	// Pour les attributs de type objets 
                // on compare dans un premier temps les références 
                if (this.id != other.id) {
                    // Si les références ne sont pas identiques
                    // on doit en plus utiliser equals()
                    if (this.id == null || !this.id.equals(other.id)) {
                        return false; // les attributs sont différents 
                    }
                }
     
                // Si on arrive ici c'est que tous les attributs sont égaux :
                return true;
            }
     
            return false;
        }
    ou alors utiliser aussi un Hashset comme le propose fnobb

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Par défaut
    Bonjour,

    N'y a-t-il aucune solution pour supprimer les doublons en passant par les collections et sans y toucher au niveau de la base de donnée? ni de convertir en array list?

    Merci !

  5. #5
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut


    A ma connaissance non, vu que c'est toi qui la remplie, donc c'est à toi dans ton code à faire le boulot pour ne pas mettre n'importe quoi dedans, notamment les doublons.

    Les solutions proposées ci-dessus utilisent déjà des collections (voir la faq) sous forme de ArrayList.
    De toute façon, c'est cela qu'attend le tag struts.

    est-ce que tu peux être plus explicite par rapport à ta demande ? Donner plus de détail par rapport à ton pb ?

    @+

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Par défaut
    Disons que je vois bien qu'ils utilisent des arraylists.

    Je récupère le contenu d'une table en passant par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QueryByCriteria query5 = new QueryByCriteria(ActionCommerciale.class);
    setOutput(OUT_DATEDEFID, broker.getCollectionByQuery(query5));
    Mais je souhaiterais partir de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Collection datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    // On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid);
    A ce que j'ai lu et ce qui parait évidant c'est de faire un set avant de mettre les objets dans la collection.
    Or je ne souhaite pas remplir ma liste à la main en passant par du :
    set.add("CCCCC");
    set.add("BBBBB");
    set.add("DDDDD");
    set.add("BBBBB");
    set.add("AAAAA");

    J'essaie de voir comment je pourrais passer à du set tout en restant sur cette base de collection.

    Si je peux faire quelque chose à partir due la class du bean ou dans l'action..

  7. #7
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut


    il y a qq chose que je ne comprends pas
    A un moment donnée tu parles de :
    N'y a-t-il aucune solution pour supprimer les doublons en passant par les collections et sans y toucher au niveau de la base de donnée? ni de convertir en array list?
    puis ensuite tu parles :
    Collection datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    // On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid);
    Moi, d'après ce que je comprends, c'est que ton datedefid est initailisé par la résultat de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Collection)service.getOutput
    et qu'ensuite tu sauvegarde datedefid en session.

    Toujours d'après ce que je comprends, ton problème pour enlever les doublons, etc, se situe dans la fonction service.getOutput.

    Comme je l'ai dit auparavant, la classe Collection est la classe mère abstraite à tout ce que est ArrayList, HashSet, etc ...
    Donc, tu peux très bien écrire les fonctions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Collection getOutput()
    {
            HashSet hs = new HashSet();
            /*  ton traitement */
            return hs;
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Collection getOutput()
    {
            ArrayList al = new ArrayList ();
            /*  ton traitement */
            return al;
    }
    et donc, utiliser ce bout de code sans initialisé ta collection avant.
    Collection datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    // On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid);
    Ce que tu peux faire aussi, c'est cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Collection datedefid = new HashSet();
    datedefid.adAll( (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID));
    // On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid);
    En théorie, il fait le boulot qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    set.add("CCCCC");
    set.add("BBBBB");
    set.add("DDDDD");
    set.add("BBBBB");
    set.add("AAAAA");
    J'espère avoir cerné ta demande

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Par défaut
    Merci pour ta patience pour un jeune néophyte comme moi.

    Je viens de lire ton post. Je l'ai pas encore testé mais je vais le faire juste après.

    Effectivement, j'avais pas saisie que set faisait parti de collection.
    De ce fait, j'étais en train de bidouiller un truc comme ça. Disons qu'effectivement je suis obligé de passer par une array list si je veux utiliser le Set ou Hashset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Collection datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    Set datedefid1 = new HashSet(); // on crée notre Set
    terator i=datedefid.iterator(); // on crée un Iterator pour parcourir notre datedefid
        	while(i.hasNext()) // tant qu'on a un suivant
        	{
    System.out.println(((ActionCommerciale)i.next()).getDateDebValAsString()); // on affiche le suivant
    datedefid1.add(((ActionCommerciale)i.next()).getDateDebValAsString());
        	}
        	/* Notez que l'itération se fait aléatoirement. */     	
        	// On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid1);
    Mais ça merdouille. Je vais voir ce que tu me conseille de faire de ce pas.

    Ceci ne marche pas, il me sort toujours des doublons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Collection datedefid = new HashSet();
    datedefid.addAll( (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID));
    // On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid);

  9. #9
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut
    re

    alors, tu dit que le code suivant ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Collection datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    Set datedefid1 = new HashSet(); // on crée notre Set
    terator i=datedefid.iterator(); // on crée un Iterator pour parcourir notre datedefid
        	while(i.hasNext()) // tant qu'on a un suivant
        	{
    System.out.println(((ActionCommerciale)i.next()).getDateDebValAsString()); // on affiche le suivant
    datedefid1.add(((ActionCommerciale)i.next()).getDateDebValAsString());
        	}
        	/* Notez que l'itération se fait aléatoirement. */     	
        	// On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid1);
    C'est normal, car il faut modifier comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Collection<ActionCommerciale> datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    Set<String> datedefid1 = new HashSet<String>(); // on crée notre Set
    Iterator<ActionCommerciale> i = datedefid.iterator()
    while(i.hasNext()) // tant qu'on a un suivant
    {
       ActionCommerciale ac = i.next();
       System.out.println(ac.getDateDebValAsString()); // on affiche le suivant
       datedefid1.add(ac.getDateDebValAsString());
    }
    /* Notez que l'itération se fait aléatoirement. */     	
        	// On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid1);
    Je type volontairement les collections, cela evite de caster par la suite les objets.
    Pour ce qui n'allait pas dans ta bouble, c'est que tu fait appel plusieurs fois de suite à i.next()
    Chaque fois que l'utilises, il lit la valeurs suivante, et dans ton cas, tu l'utilisais 1 valeur pour un print, et la valeur suivante pour le mettre dans la collection, donc, il te manque des enregistrements.
    Avec cette correction, cela devrait mieux marcher

    Ensuite, tu dis que ce code là ne fonctionne pas, car il y a toujours de doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Collection datedefid = new HashSet();
    datedefid.addAll( (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID));
    // On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid);
    Ce code marche parfaitement, car tu ne fais que placer une collection dans une variable, puis stocker cette variable en session.
    Tu peux ecrire ce qui suit, cela fera la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.getSession().setAttribute("DatedeFid", (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID));
    Pour enlever les doublons sans faire tout ce qu'on fait avant, il faut que tu modifie directement la fonction getOuput de ton objet service pour que lui te renvoie une collection sans doublons.
    Je ne fais ce qu'elle fait ta fonction getOuput, mais si c'est une requête SQL qui est exécuté, faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT col1, col2 from tab1
    ou si tu récupère une list depuis un parse xml ou lecteure d'un fichier ou d'une autre source, faire à ce moment là la boucle vu plus haut avec le HashSet

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Par défaut
    Salut,

    J'ai un souci ... Disons que je ne peux pas procéder au typage comme tu m'indiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Collection<ActionCommerciale> datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    Set<String> datedefid1 = new HashSet<String>(); // on crée notre Set
    Iterator<ActionCommerciale> i = datedefid.iterator()
    Le souci est que je suis sur du JDK 1.4 et semblerait que le typage soit à partir du 1.5


    Pour la récupération à partir de la base de donnée, je passe par ojb . Je fais appel à criteria pour récupérer ma liste déroulante.
    Sinon faudrait que je passe par l'autre écriture qui est sqlByQuery mais faut que je vois un exemple, mais c'est une autre solution bien évidement mais comme je me suis pas vraiment plongé dedans alors j'ai continué avec du critéria qui était déjà utilisé dans l'appli.

  11. #11
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut
    oui, effectivement, ce code fonctionne à partir à partir de java 1.5
    Donc, en 1.4 cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Collection datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
    Set datedefid1 = new HashSet(); // on crée notre Set
    Iterator i = datedefid.iterator()
    while(i.hasNext()) // tant qu'on a un suivant
    {
       ActionCommerciale ac = (ActionCommerciale)i.next();
       System.out.println(ac.getDateDebValAsString()); // on affiche le suivant
       datedefid1.add(ac.getDateDebValAsString());
    }
    /* Notez que l'itération se fait aléatoirement. */     	
        	// On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
    request.getSession().setAttribute("DatedeFid", datedefid1);
    Pour ojb, je ne connait pas, mais je pense qu'avec les criteria il doit être possible de spécifier que tu veux du DISTINCT

    Bon, j'espère que tu pourras avancé

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Par défaut
    Salut,
    Merci pour tes réponses.
    J'arrive enfin à faire afficher sans les doublons par ton aide en faisant ça :

    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
     
        	Collection datedefid = (Collection)service.getOutput(InitPortefeuilleBusinessService.OUT_DATEDEFID);
        	Set datedefid1 = new TreeSet(); // on crée notre Set
        	Iterator i = datedefid.iterator();
        	while(i.hasNext()) // tant qu'on a un suivant
        	{
        	   ActionCommerciale ac = (ActionCommerciale)i.next();
        	   System.out.println("toto:"+ac.getDateDebValAsString()); // on affiche le suivant
        	   datedefid1.add(ac.getDateDebValAsString());
        	}
        	/* Notez que l'itération se fait aléatoirement. */    
        	System.out.print(datedefid1);
        	Iterator j = datedefid1.iterator();
        	while(j.hasNext())
        	{
        		System.out.println("titi:"+j.next());
        	}    		
        	    	// On fait un getsession() car on a besoin de récupérer des objets JAVA dans nos pages .jsp
        	request.getSession().setAttribute("DatedeFid", datedefid);
    Bon Ok, j'ai fait un TreeSet mais manque de peau il me sort sous cet ordre..:
    14:30:26,456 INFO [STDOUT] [01/06/2009, 01/07/2008, 01/08/2008]
    14:30:26,456 INFO [STDOUT] titi:01/06/2009
    14:30:26,456 INFO [STDOUT] titi:01/07/2008
    14:30:26,456 INFO [STDOUT] titi:01/08/2008

    Le souci est qu'à cette ligne ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.getSession().setAttribute("DatedeFid", datedefid);
    Je ne peux pas mettre datedefid1 car j'aurais un problème de bean qu'il ne va pas trouver...

    Là, j'essaie de voir comment pouvoir récupérer les valeurs issus du TreeSet pour le réinjecter dans une collection. De manière à ce que je puisse les voir enfin dans la liste déroulante.

  13. #13
    Membre expérimenté Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Par défaut
    tip top

    ca avance, bon ben courage pour la suite

Discussions similaires

  1. [access]doublons dans une table en access !
    Par hackerandco dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/06/2004, 14h45
  2. [CR] doublon dans les valeurs
    Par Gaëtane dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 02/06/2004, 15h25
  3. [langage] Suppression de doublon dans tableau
    Par LFC dans le forum Langage
    Réponses: 5
    Dernier message: 15/04/2004, 14h08
  4. recherche de doublons dans un fichier texte
    Par portu dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 07/10/2003, 14h13
  5. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

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