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

Collection et Stream Java Discussion :

Exploiter un hashmap


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Par défaut Exploiter un hashmap
    Bonjour tout le monde ,

    J'ai un petit problème avec un hashmap qui contient un hashmap.

    Mon hashmap est sous forme de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hashmap <Set<String>, Hashmap<Set<String>>, Float>
    Set<String> : ensemble de classes CS
    Hashmap<Set<String>>, Float> : un hashmap contient comme clé de classes correspondantes à CS et une mesure de pertinence de couple (CS, CR) (float).

    Ci joint une explication :
    problème.doc

    les CSi : Set<String>
    les CRj et les valeurs en rouge représentent Hashmap<Set<String>>, Float>

    Je veux parcourir cet hashmap : Hashmap <Set<String>, Hashmap<Set<String>>, Float> de telle façon de voir les lignes et les colonnes , je sais pas comment faire. Mon objectif est de voir par exemple d'après la matrice jointe que la ligne 1 contient plusieurs valeurs pour une même classe CS1 donc il faut prendre la valeur maximum et la garder dans la première ligne et pour les autres valeurs , je mets à jour le hashmap (ou autrement la matrice) et j'ajoute des autres lignes avec les autres valeurs. Tout simplement je veux que chaque ligne contient une valueur pour chaque classe. Merci de m'aider à avoir la bonne solution

  2. #2
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Salut,

    ce sera mieux comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map <String, Map<String, Float> map
    et la javadoc, ta nouvelle meilleur amie:
    http://java.sun.com/javase/6/docs/api/
    package java.util

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Par défaut
    Comment faire alors ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    D'abord, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hashmap <Set<String>, Hashmap<Set<String>, Float>>
    Sinon, ca ne compilera meme pas!

    Ensuite, est-tu conscient du type bizzare que tu défini la?

    Une map, dont les clés sont chacune un ensemble de String
    et donc les valeurs sont, chaque fois, une nouvelle map.

    Dans ces map qui servent de valeur, encore une fois, chaque clé est un nouvel ensemble de String, chacune. Visuellement, ca donnerais ce genre de structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [a,b,c] -> [ [A,B,C] -> 0.1
                 [D,E] -> 0.5
                 [F,G] -> 0.2 
               ]
    [x,y,z] -> [
                 [A,B] -> 9.4
                 [D,E,F,G] -> 6.7
               ]
    Est-ce ça que tu cherche??

    De plus, comme tu utilise des Set comme clé, ils doivent être immuables (ne peuvent être modifié) sinon tu va foutre le bazar dans la hashmap.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Par défaut
    merci tchize pour l'explication mais en fait ce que tu viens de l'expliquer , ce que je veux . à partir de la matrice que j'ai posté plus haut, mon objectif :
    j'ai une hashmap qui contient un ensemble de classe <Set<String>> qui sont mentionnées par CS1, CS2, ... dans la matrice que j'ai posté dans l'@ ci dessus et pour chaque CS1, CS2.. j'ai un ensemble de CR1, CR2.., la pertinence entre le couple (CSi, CRj) correspond une valeur c'est l'intersection des de CSi et CRj
    (les valeurs qui sont en rouge). Mon souci en fait, (c'est ça l'approche), quand j'ai plusieurs valeurs dans la même ligne, il faut que je prend le maximum et je le mets dans la première ligne (je vais éclater la classe CSi) et les autres valeurs de même ligne, je mets à jour le hashmap en ajoutant d'autres lignes de telle façon d'avoir à chaque ligne une valeur. prenons un exemple : j'ai une classe CS1 qui correspond à 3 classes CR, CS1={CR1,CR2, CR3}, la pertinence de (CS1, CR1) = 0.2, (CS1, CR2) = 0.3 , (CS1, CR3) = 0.4. la mise à jour de Hashmap sera en fait mettre la valeur maximum dans la première ligne c'est à dire (CS11, CR3) = 0.4 et les autre valeurs , on ajoute deux lignes de telle façon qu'on va avoir : (CS12, CR1) = 0.2 * une constante1 et (CS13, CR2) = 0.3 * une constante2, voilà . Puis il faut étudier
    le cas pour les colonnes, si j'ai plus qu'une valeur dans une colonne par exemple dans mon cas, la colonne de CR3 et CR4, alors il faut fusionner les lignes et faire la moyenne de la pertinence , autrement dit , citons l'exemple de (CS11, CR3) = 0.4 et (CS3, CR3) = 0.5 alors deux classes correspondent à la même classe CR3 donc on fusionne la classe ({CS11, CS3}, CR3) = (0.4+0.5)/2. voilà clairement mon problème c'est pour ça j'utilise :
    Hashmap <Set<String>, Hashmap<Set<String>, Float>>, comme j'ai expliqué plus haut.

    Voici la matrice que je veux obtenir en partant de l'ancienne : probsolution.doc

    Merci bien de m'aider à trouver une solution pour ce problème

    Merci infiniment

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je n'ai rien pour ouvrir le .doc, prière donc de décrire sur le forum ce que tu cherche à obtenir.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Par défaut
    en fait j'ai expliqué plus haut ce que je veux faire vraiment et je vous le même document précédent en .jpeg que j'espère que vous pouvez l'ouvrir car j'ai voulu expliquer ce qui est écrit par un dessin c'est plus facile .

    le fichier : Nom : probsol.jpg
Affichages : 110
Taille : 36,6 Ko

    Merci infiniment de m'aider

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Hmm franchement pour ma part je trouve les explications totalement incompréhensible. En faite on comprend pas le but que tu recherches . C'est pour un exercice ? tu travailles sur un algo ? Tu essaies de faire des calculs matriciels ? Tu appliques un pivot de gauss ?

    Tant que tu expliqueras pas concrètement ce que tu recherches à faire il est difficile de t'aider. La on voit trés bien que tu "fais n'importe quoi" avec les collections.

    D'aprés je comprend c'est un problème purement matriciel ce que tu expliques. Tu as une matrice(4x4) au départ et tu obtiens une matrice (4x4) à la fin de ton algo.

    Donc dans ton cas tu n'as pas besoin d'utiliser ces collections elles ne sont pas adaptées à ton problème. De plus tu parles tout le temps de classes , mais en java une Classe, c'est par exemple la classe Voiture . Et une renault 205 est une instance de la classe Voiture (un objet).

    Mais dans ce que je comprend tu ne manipules finalement que des floats , ce sont des types de bases. Donc tu n'as pas réellement besoin d'utiliser des objets surtout pour du pur calcul matriciel.

    Un tableau est une matrice , cela suffit amplement à réaliser tes calculs. Si tu veux donc une matrice 4x4 .
    Il suffit de faire ça : float[][] mat = new float[4][4];

    Ensuite tes cr1,cr2 ce sont les indices de ton tableaux . tu as justes à les utiliser pour accéder aux valeurs de la matrice.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Par défaut
    Merci pour votre réponse. En fait je vais m'expliquer plus clairement en s'appuyant sur l'image postée plus haut :
    on a :

    - un hashmap : Hashmap <Set<String>, Hashmap<Set<String>, Float>> (pour mon exemple représente toute la matrice avec les CSi, CRj, et les valeurs en rouge) contenant :

    Set<String> ---> un ensemble de classes CS1, CS2, ... (c'est pas des classes java mais des sorties des systèmes que je vais les tester à la finn, je les appelle des classes mais on peut les appeler X, Y, Z, ... ) <Set<String>>

    Hashmap<Set<String>, Float> ---> un autre ensemble de classes CR1, CR2, CR3,... à lesquelles on veut correspondre l'ensemble des classes précédentes (CS1, CS2, ...),

    ---> en fait, la correspondance entre les deux ensembles vus précédemment est représentée par une valeur de pertinence qui est mentionnée en rouge dans la figure (image .jpeg).

    Je cherche à faire un algorithme qui me permet de résoudre :

    1. si j'ai plusieurs valeurs dans la même ligne, il faut que je prend le maximum et je le mets dans la première ligne (je vais éclater la classe CSi) et les autres valeurs de même ligne, (je mets à jour le hashmap) j'ajoute des lignes dans le hashmap de telle façon d'avoir à chaque ligne une valeur. prenons un exemple : si j'ai une classe CS1 qui correspond à 3 classes CR, CS1={CR1,CR2, CR3}, la pertinence de (CS1, CR1) = 0.2, (CS1, CR2) = 0.3 , (CS1, CR3) = 0.4. la mise à jour de Hashmap sera en fait de prendre la valeur maximale de la ligne ligne c'est à dire (CS1, CR3) = 0.4 et les autre valeurs , on ajoute deux lignes de telle façon qu'on va avoir (on éclate CS1 à CS11, CS12, CS13): (CS12, CR1) = 0.2 * cte1 et (CS13, CR2) = 0.3 * cte2, voilà.

    2. étudier les valeurs en colonnes, si j'ai plus qu'une valeur dans la même colonne par exemple dans mon cas, la colonne de la classe CR3 et la colonne de la classe CR4, alors il faut fusionner les lignes et faire la moyenne de la pertinence , autrement dit , citons l'exemple de (CS11, CR3) = 0.4 et (CS3, CR3) = 0.5 alors ces deux classes correspondent à la même classe CR3 donc on fusionne les classes CS11 et CS3 ensemble comme suit avec la classe CR3: ({CS11, CS3}, CR3) = (0.4+0.5)/2.

    Je demande un code en java ou un algorithme que je le traduis en Java, qui me permet de faire les mise à jour possible ainsi que les modifications possibles pour un hashmap et me permet d'obtenir la matrice vu dans ma réponse précédente.

    Merci bien de m'aider à trouver une solution pour ce problème

    Merci infiniment

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 156
    Par défaut
    Tu peut écrire ton objectif en une ligne, car la c'est trop long. À la louche ça fait quoi ton programme ?

    Par ailleurs il est probable que la méthode hashcode des set ne soit pas la bonne, je sais pas si elle est surchargé.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Par défaut
    Tu peut écrire ton objectif en une ligne, car la c'est trop long. À la louche ça fait quoi ton programme ?

    Mon objectif dans une ligne c'est d'avoir toujours une valeur et en colonnes aussi c'est pour ça :

    - en ligne : je fais éclater la classe CS1 en CS11, CS12 et CS13 et à chaque ligne j'aurai une seule valeur

    - en colonne : je fusionne les lignes et je fais leur moyenne c'est le cas de CS11 et CS3.

    Voilà j'espère que je suis claire maintenant.

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par DionCeli Voir le message

    - en ligne : je fais éclater la classe CS1 en CS11, CS12 et CS13 et à chaque ligne j'aurai une seule valeur
    Pour ça, il suffit de faire deux boucle imbriquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (Set<String> set: map.keySet){
       for (String ligne: set){
          // ligne représente, par exemple CS11
       }
    }
    - en colonne : je fusionne les lignes et je fais leur moyenne c'est le cas de CS11 et CS3.
    La je vois pas trop comment tu fusionne des lignes en colonne, mais va falloir faire du calcul (je sais j'enfonce une porte ouverte). Faudra donc faire une table intermédiaire calculée suivant ce que tu veux faire, voir, idéallement, faire un classe spécialisée pour tes calcul (qui cacherais à tes yeux la hashmap de stockage). Dans tous les cas, ton algo pour remettre tout en semble est calculer tes moyenne, le mieux à faire pour toi c'est de prendre un papier, un crayon et d'essayer d'imaginer comment faire l'algo (ça, on va pas le faire pour toi).

    Voilà j'espère que je suis claire maintenant.[/QUOTE]

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Par défaut
    en fait pour les colonnes je veux pas aussi avoir plusieurs valeurs dans une colonne je veux voir qu'une seule valeur c'est à dire par exemple :

    dans la colonne CR3, j'ai deux valeurs celle de la classe CS11 et CS3 donc je regroupe les deux classes dans une seule {CS11, CS3} et je calcule la moyenne des valeurs ((0.4 + 0.5) /2), voilà .

    j'espère que je suis pour les colonnes.

    Merci bien de m'aider à faire ça

  14. #14
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    j'espère que je suis pour les colonnes


    Je ne comprends pas pourquoi tu t'acharnes avec ta Hashmap <Set<String>, Hashmap<Set<String>, Float>>

    Aux vues de ce que tu postes depuis un moment, avant de pouvoir utiliser un Set en clef de Map de façon correcte, il va te falloir du temps voir même des cours.

    De plus cette structure ne me semble pas du tout répondre à ton besoin.

    Pars plutôt sur ce que proposait Elendhil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float[][] mat = new float[n][m];
    ou alors si tu tiens vraiment à utiliser une Map, sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map <String, Map<String, Float> map
    Remplis déja ta structure avec tes données et essaye de les récupérer.
    Tu auras certainement les idées plus claires après ca et tu pourras poser des questions que nous pourrons peut être comprendre.

Discussions similaires

  1. Exploitation de base sur un serveur Web
    Par Oz-WereWolf dans le forum Installation
    Réponses: 10
    Dernier message: 07/03/2004, 22h52
  2. exploiter un évènement d'un sous composant dans un
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 16h44
  3. [VB6] Exploiter un doc PowerPoint avec VB
    Par Tranber dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/09/2002, 16h22
  4. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47
  5. PB mise en exploitation
    Par DiceChris dans le forum CORBA
    Réponses: 21
    Dernier message: 05/07/2002, 16h05

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