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 :

utilisation de TreeMap java


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut utilisation de TreeMap java
    Bonjour,
    j'ai des données qui listent tous les achats de clients.
    je voudrais récupérer pour chaque client la liste ordonnée de ses achats, par exp:
    Client1-->Poduit a,Produit b,Produit c (achetés dans cet ordre là)
    le but c'est de savoir s'il existe d'autres clients qui ont acheté déja les mêmes produits et dans ce même ordre exactement.
    j'ai pensé à utiliser des TreeMap et créer pour chaque client une TreeMap contenant ses produits.
    je voudrais savoir si c'est vraiment le bon choix.
    Merci.

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bon, si j'ai bien compris ce que tu veux (), je te conseille ceci:
    Tu utilises une Map (HashMap à priori, pas besoin d'ordonner donc pas besoin d'une TreeMap) qui associe à un client une liste de produit. (Map<Client, List<Produit>> en 1.5 ou +)

    Après pour savoir quels clients ont les mêmes achats (dans le même ordre) que le 'clientRef', tu fais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List<Client> memesAchats = new ArrayList<Client>();
    for(Client client : map.keySet()) {
        if (map.get(client).equals(map.get(clientRef)) {
            memesAchats.add(client);
        }
    }
    A noter que clientRef sera dans ta liste memesAchats.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Merci Deaf pour ta réponse.
    En fait c'est un petit peu plus compliqué. chaque client a plusieurs sessions et je dois récupérer cette liste ordonnée de produits par session client. et à la fin dans ma liste je veux rajouter la liste de produits communs entre clients et non pas le ClientRef.
    j'ai essayé ce code là avec Equals mais ça 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
    13
    14
    15
    16
     
    for (Iterator it = productSessionsClientA.values().iterator(); it.hasNext();){
        		  	HashMap productsClientA = (HashMap)it.next();	
     
     
        	  for (Iterator itr = productSessionsClientB.values().iterator(); itr.hasNext();){
        		  	HashMap productsClientB = (HashMap)itr.next();	  
     
     
    			  if(productsClientB.equals(productsClientA)){
     
    			  ArrayList tst = new ArrayList();
    			  tst.add(productsClientB);
     
    			  }
    			  }}

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    J'aurais besoin de quelques éclaircissement :
    - que représente productSessionsClientA?
    - que représente productsClientA?

    je comprend que productsClientA est une valeur de productSessionsClientA, mais pour ces deux Map, quelles sont les clés?
    L'usage le plus courant des Map est le parcours par les clés, et non par les valeurs.
    Eclaire-moi, et j'essaierai de t'aider davantage.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    productSessionsClientA est une hashMap qui représente les produits achetés par client et par session, par exp pour le client1 :
    {304=304}
    {288=288, 322=322, 874=874}
    {307=307, 303=303}
    {301=301}
    chaque ligne représente une transaction.

    productsClientA c'est une autre hashMap qui récupère ces mêmes valeurs de produitsID(disons que ça fait un peu double emploi)
    En fait mon grand souci c'est comment comparer 2 collections: une hashMap de client A :productsClientA et une hashMap du client B:productsClientB tout en les parcourant.
    et je voudrais faire cette comparaison session par session, c'est pour ça que je faisais une itération au début sur les produits par session.
    je ne sais pas si j'étais assez claire

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Euh... non, je n'ai pas trop compris.
    Peux-tu détailler un peu plus ton exemple : que représente {288=288, 322=322, 874=874}.
    Je suppose que les nombres sont les ID des produits, mais 288=288, ça signifie quoi?

    Comme j'ai pas totalement compris, je peux me tromper, mais j'ai l'impression que l'utilisation de Map n'est pas bonne.

  7. #7
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    désolé c'était pas le bon exp.
    Là j'ai fait un affichage de "productsClientA" qui est une HashMap <Integer,Integer>:
    {0=1022}
    {0=683, 1=673}
    {0=304}
    {0=288, 1=322, 2=874}
    {0=303, 1=307}
    les Id sont un simple compteur (cpt++), je ne pouvais pas stocker l'id du client ou de la session parce qu'il n'est pas unique.
    par contre "productSessionsClientA" est la HashMap "mère" disons, qui est sous forme de: <Integer,HashMap> --><IdSession,productsClientA>, Exp:
    88516={0=12, 1=560}, 72487={0=7}, 72751={0=222}

    j'ai besoin donc de comparer les hashMap:"productsClientA" et "productsClientB", "productsClientC" ,"productsClientD"...mais session par session.

  8. #8
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Ok, ça commence à venir!

    Pour ta Map mère, ça semble bon.
    Par contre, ta seconde map ne semble pas appropriée.
    Puisque tu utilises un compteur unique à chaque map clientProductA, pourquoi ne pas utiliser une liste? L'équivalent de ton compteur sera la position dans la liste.

    Maintenant, peux-tu reformuler ta question originale avec les exemples?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Je tente ma chance....

    Pour enregistrer les sessions/produits;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Map<String, Collection<Product>> sessions =
        new HashMap<String, Collection<Product>>();
     
    // la LinkedHashSet conserve l'ordre d'enregistrement
    if (sessions.get(sessionId) == null)
        sessions.put(sessionId, new LinkedHashSet<Product>();
     
    // enregistrement des produits les uns après les autres
    Collection<Product> products = sessions.get(sessionId);
    poducts.add(productA);
    poducts.add(productZ);
    poducts.add(productX);
    Pour comparer la liste de produit des sessions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (Entry<String, Collection<Product>> e1 : sessions.entrySet()) {
        for (Entry<String, Collection<Product>> e2 : sessions.entrySet()) {
            Collection<Product> products1 = e1.getValue();
            Collection<Product> products2 = e2.getValue();
            if (products1 != products2 && products1.equals(products2))
                System.out.println("la liste de produit existe déjà");
        }
    }

  10. #10
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Désolé je n'ai pas tout lu alors je suis peut être hors de propos ...

    sur les collection tu as des méthods contains, retain ... c'est très utile pour comparer le contenu de 2 collections.
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  11. #11
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    oui je connais les méthodes contain...j'avais essayé de les appliquer, mais en fait ça concerne une seule valeur, avec les Map et HashMap -->containsKey, containsValue..
    je suis entrain de voir la proposition de Duc lebowski et voir comment l'appliquer. A titre indicatif, les données sur les produits et les sessions, je ne les récupère pas en temps réel et je ne les enregistre pas un à un. toutes mes données sont dans un fichier txt que j'ai trié à l'avance, que je parse après et j'alimente après mes hashMap, listes...
    pour répondre à la question de Deaf, j'ai mis des commentaires:
    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
     
    //ici je parcours la hashMap mère qui contient: <IdSess,<cpt=IdProduit>>
    for (Iterator it = productSessionsClientA.values().iterator(); it.hasNext(){
    //ici je récupère les values: <cpt=IdProduit>
    HashMap productsClientA = (HashMap)it.next();
    //je fais la même chose pour le clientB
    for (Iterator itr = productSessionsClientB.values().iterator(); itr.hasNext(){
    HashMap productsClientB = (HashMap)itr.next();
     
    //et là j'ai besoin de comparer les 2 collections et avec equals ça ne marche pas
    if(productsClientB.equals(productsClientA)){
     
    ArrayList tst = new ArrayList();
    tst.add(productsClientB);
     
    }
    }}
    l'affichage est mieux comme ça.

  12. #12
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Alors, si j'en crois la Javadoc, la méthode equals des Map fait la comparaison des entrySet :
    Compares the specified object with this map for equality. Returns true if the given object is also a map and the two maps represent the same mappings. More formally, two maps m1 and m2 represent the same mappings if m1.entrySet().equals(m2.entrySet()). This ensures that the equals method works properly across different implementations of the Map interface.
    Donc cela ne semble pas utile de refaire l'algo à la main, l'appel à equals semble suffisant.

    Le premier problème que je vois, c'est que ta List résultat est initialisée à chaque fois que tu trouves une correspondance.
    De plus elle est déclarée dans ton if, donc je vois pas comment tu peux te servir du résultat.

  13. #13
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Désolé pour ce retard de réponse,
    j'ai pu finalement résoudre le prb, j'ai dû faire 2 fonctions: une qui retourne les produits communs à 2 clients pour une seule session et l'autre fonction fait ça pour ttes les sessions.
    Merci à tous pour votre aide.

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

Discussions similaires

  1. Erreur lors de l'utilisation de TableSorter.java
    Par Frac10 dans le forum AWT/Swing
    Réponses: 47
    Dernier message: 20/11/2006, 12h06
  2. [Protocole] Utiliser SNMP sous Java !?
    Par condor_01 dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 31/07/2006, 12h19
  3. Utilisation DLL avec java et licence ?
    Par dinver dans le forum Général Java
    Réponses: 4
    Dernier message: 13/04/2006, 21h23
  4. [API] Utiliser Samba avec Java
    Par Begood dans le forum Général Java
    Réponses: 1
    Dernier message: 13/03/2006, 19h26
  5. utiliser DocBook avec Java et générer du HTML
    Par hélia dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/03/2006, 17h09

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