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

Servlets/JSP Java Discussion :

Problème au niveau du remplissage de HashMap


Sujet :

Servlets/JSP Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut Problème au niveau du remplissage de HashMap
    Bonjour

    J'ai le code suivant qui permet de remplir un hashmap par des 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
    21
    22
    23
    24
    25
    @Override
       public List<Offre> rechercheRapide(String CHAMP_TYPE_OFFRE, String CHAMP_VILLE, String CHAMP_REGION, String CHAMP_SECTEUR,String typeOffre, String ville, String region, String secteur) throws DAOException {
     
            Map myMap=new java.util.HashMap();
     
               // Ajout des objet dans le tableau associatif
              myMap.put(CHAMP_TYPE_OFFRE, typeOffre);
              myMap.put(CHAMP_VILLE, ville);
              myMap.put(CHAMP_REGION, region);
              myMap.put(CHAMP_SECTEUR, secteur);
     
     
       // Afficher le contenu du MAP
       Set listKeys=myMap.keySet();  // Obtenir la liste des clés
       Iterator iterateur=listKeys.iterator();
       // Parcourir les clés et afficher les entrées de chaque clé;
       String s="select * from Offre where ";
       while(iterateur.hasNext())
       {
           Object key= iterateur.next();
           s=s+(String)key+" = ? and ";
       }
           System.out.println("la requete est: "+s);
    ...
    }
    Ce résultat m'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    la requete est: select * from Offre where region = ? and type_offre = ? and ville = ? and secteur = ? and
    region vient en 1er, suivi de type_offre, ville et secteur.

    Pourtant lorsque j'ajoute les valeurs dans la Map, c'est type_offre qui est censé venir en 1er, suivi de ville, region et secteur.

    Même dans ma Servlet l'ordre type_offre,ville, region, secteur est respecté:

    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
    public class RechercheRapide extends HttpServlet {
     
    private static final String CHAMP_TYPE_OFFRE = "type_offre";
        private static final String CHAMP_VILLE = "ville";
        private static final String CHAMP_REGION = "region";
        private static final String CHAMP_SECTEUR = "secteur";
     
    public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
     
    HttpSession session =  request.getSession();
     
            String typeOffre = getValeurChamp( request, CHAMP_TYPE_OFFRE );
    String ville = getValeurChamp( request, CHAMP_VILLE );
    String region = getValeurChamp( request, CHAMP_REGION );
    String secteur = getValeurChamp( request, CHAMP_SECTEUR);
     
    List<Offre> listeOffres = offreDao.rechercheRapide(CHAMP_TYPE_OFFRE, CHAMP_VILLE, CHAMP_REGION, CHAMP_SECTEUR, typeOffre, ville, region, secteur);
             Map<Long, Offre> mapListeOffres = new HashMap<Long, Offre>();
                for ( Offre offre : listeOffres )
                {
                    mapListeOffres.put( offre.getId(), offre );
                }
                session.setAttribute( ATT_SESSION_OFF, mapListeOffres );
     
    }
     
      private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
    String valeur = request.getParameter( nomChamp );
    if ( valeur == null || valeur.trim().length() == 0 ) {
    return null;
    } else {
    return valeur;
    }
    }
     
    }
    Donc je ne comprends pas pourquoi j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    la requete est: select * from Offre where region = ? and type_offre = ? and ville = ? and secteur = ? and
    Au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    la requete est: select * from Offre where type_offre = ? and ville = ? and region = ? and secteur = ? and
    Merci

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Une HashMap ne conserve pas l'ordre d'ajout des entrées. Tu peux utiliser une LinkedHashMap à la place.

  3. #3
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Si tu lis la JavaDoc sur les HashMap, c'est marqué noir sur blanc :
    This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.
    Une HashMap, comme son nom l'indique se base sur un table de hachage. La clé utilisé va être haché via la méthode hashCode() de ton objet, puis le résultat servira effectivement de clé pour la map.

    Tu peux utiliser une LinkedHashMap à la place.

    Edit : Grillé

  4. #4
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Merci beaucoup, ça marche

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

Discussions similaires

  1. [UBUNTU] Problème au niveau du partitionnement
    Par Louis-Guillaume Morand dans le forum Ubuntu
    Réponses: 19
    Dernier message: 19/07/2006, 18h05
  2. [CSS] Problème au niveau de la résolution
    Par shukin dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/10/2005, 13h29
  3. [PPC][C#][SQL2000] Problème au niveau de donné controlé
    Par Roach dans le forum Windows Forms
    Réponses: 16
    Dernier message: 21/09/2005, 22h08
  4. problème au niveau de restore database
    Par Redouane dans le forum Administration
    Réponses: 2
    Dernier message: 07/09/2005, 11h49
  5. [DNS MX]Avec DynDNS.org, problème au niveau du MX
    Par Swoög dans le forum Développement
    Réponses: 9
    Dernier message: 24/08/2004, 22h00

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