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 :

Parcourir une map en fonction de deux critères


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 33
    Points : 33
    Points
    33
    Par défaut Parcourir une map en fonction de deux critères
    Bonne nuit ou bonjour

    J'ai une HashMap qui contient des objets. La clé est un integer.
    J'ai besoin de trier cette map pour diverses raisons, et de ressortir les résultats en fonction de deux id (deux int).

    Il faut voir les clés comme un rang et un ordre, ou une ligne et une colonne.
    J'ai besoin de trier tout ça de façon croissante. J'avais pensé concaténer les deux identifiants en int ou en double.

    Mais ça plante evidemment puisque 1.4 est > à 1.36 alors que dans mon classement il devrait arriver avant. J'arrive pas à dissocier les deux clé dans le tri en gros.

    Je sais pas si je suis clair.
    Mais si quelqu'un voit comment faire
    Zut je fais des rimes...
    enfin je suis prêt à suivre
    Thks

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour

    Je ne comprend pas ton problème.
    tu veux dire que tu as un map dans le contenue est un map
    Sinon, pourquoi ne pas utiliser un SortedMap ?

    A+.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 33
    Points : 33
    Points
    33
    Par défaut
    J'ai un map dont le contenu est un liste d'objets. Comme je les récupère pas via leur véritable ordre. Je créé la clé, basée sur deux attributs de chaque objet: deux int.

    On peut imaginer un élève et une classe. C'est la concaténation des deux qui fait la clé.

    1 1
    1 2
    ....
    2 1
    2 2
    ....

    Le souci, c'est que j'ai besoin de les ressortir dans ce même ordre. Je me suis servi d'un TreeMap, mais ca le fait pas. Je vais voir l'objet SortedMap, ou si je peux faire autrement

  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
    Bonjour,

    Une TreeMap est une SortedMap (SortedMap = interface, TreeMap = implémentation).

    Pour ton problème l'idéal est soit:
    - de mettre en clé un Comparable qui contient tes deux ints et d'utiliser une SortedMap sans comparateur (elle utilisera le compareTo des clés),
    - de mettre en clé un objet de ton choix (contenant les deux ints) et de fournir un comparator à ta SortedMap.

    Edit
    Pour la seconde solution, tu peux très bien utiliser des Entry:
    SortedMap<Entry<Integer, Integer>, Object>

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par lucares Voir le message
    Bonne nuit ou bonjour

    J'ai une HashMap qui contient des objets. La clé est un integer.
    J'ai besoin de trier cette map pour diverses raisons, et de ressortir les résultats en fonction de deux id (deux int).
    Tes deux int, ils sont liés à la valeur ?
    Sinon je ne vois comment ta clé Integer peut stocker deux entiers. Ou alors c'est une clé BigDecimal et tu stockes dedans deux entiers de manière peu idoine en faisant clé1,clé2 ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 33
    Points : 33
    Points
    33
    Par défaut
    Oui c'est stocké de façon peu élégante.
    Je vais m'orienter vers un objet sur lequel je pourrais jouer plus aisément.

    Je sais pas si c'est ce qu'il y a de plus propre, mais bon...

    Pour résumé l'idée, j'ai des objets dont je vais me servir pour renseigner un fichier, du coup j'aimerai les récupérer avec leur ordre logique.
    Ce qui est pas encore le cas.

    Par orde logique, j'entends tous les gens par exemple du rang 1 (rang 1 - 1 à ...)
    puis du rang 2, puis du rang 3.
    Et ces deux int sont posés, j'ai pas d'autres outils à ma dispo pour trier.

  7. #7
    Membre averti Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Points : 435
    Points
    435
    Par défaut
    Un renseignement sur les collections --> ici....
    Je pense que un tableau de tableau peut aider à comprendre si tu sait combien et ou tu veux stocker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int rang[]; 
    int ordre[][];
    ou comme dis Deaf sa seconde solution si tu veux conserver un type Map.
    Personnellement, je préfère les List et un tri en fonction de l'id d'une variable de l'objet...
    I
    Aussi haut que soit le trône on n'est jamais assis que sur son cul...

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Drakiss Voir le message
    Personnellement, je préfère les List et un tri en fonction de l'id d'une variable de l'objet...
    Mais une List n'est pas intrinsèquement triée, elle ne l'est que si on a pensé à la faire trier depuis la dernière fois qu'on y a ajouté un truc.
    Une SortedMap est triée à tout moment, par nature.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par lucares Voir le message
    Oui c'est stocké de façon peu élégante.
    Je vais m'orienter vers un objet sur lequel je pourrais jouer plus aisément.
    Mais justement, c'est stocké comment ? BigDecimal ? Autre ? Ça peut se changer ?
    Est-ce que tu pourrais montrer un peu de code, qu'on puisse t'aider ...

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 33
    Points : 33
    Points
    33
    Par défaut
    Je suis en train de pas mal bidouiller. Je pense que je vais faire une méthode qui reprendra la map, triera, et recrééra la map.

    Au départ, j'avais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    		TreeMap<Integer, Episode> mapEpisodeTriee = new TreeMap<Integer, Episode>();
    		for(Entry<Integer, Episode> entry : mapEpisodes.entrySet()) {
    		    Integer maCle = entry.getKey();
    		    Episode monEpisode = entry.getValue();
    		   //System.out.println(monEpisode.getSaison() + " " + monEpisode.getNumero());
    		    String idEpi = String.valueOf(monEpisode.getNumero());
    		   String lien = String.valueOf(monEpisode.getSaison()).concat(idEpi); 
    		    int lienInt = Integer.parseInt(lien);
    		    mapEpisodeTriee.put(lienInt, monEpisode);
     
    		}
    La première est rempli à partir d'un fichier , les données n'y sont pas triées. Elles contiennent des objets "episodes".

    Au départ je voulais rester là dessus, pour faire un truc pas trop moche.
    Mais là je pense à une simple méthode. Je la bidouille tout à l'heure. Je l'ai commencée

    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
     
    HashMap<Integer, Episode> mapRecupEpisodes = recupEpisodes(pathTxt);
    		ArrayList<Integer> listeInt = new ArrayList<Integer>();
    		for (int i = 0; i < mapRecupEpisodes.size(); i++) {
    			Episode episode = mapRecupEpisodes.get(i);
    			int saison = episode.getSaison();
    			listeInt.add(saison);
    		}
    		//je vire les doublons
            Set<Integer> set = new HashSet<Integer>() ;
            set.addAll(listeInt) ;
            ArrayList<Integer> distinctList = new ArrayList<Integer>(set) ;
            for (int j = 0; j < distinctList.size(); j++) {
            	//System.out.println(distinctList.get(j) );
            	//String nameMap = "map".concat(String.valueOf(j));
            	TreeMap <Integer, Episode>  nameMap = new TreeMap <Integer, Episode>();
            	for (int k = 0; k < mapRecupEpisodes.size(); k++) {
        			Episode episode = mapRecupEpisodes.get(k);
        			if (episode.getSaison() == k ) {
    					nameMap.put(k, episode);
    				}
            	}
            	TreeMap <Integer, Episode>  mapTot = new TreeMap <Integer, Episode>();
            	for (int l = 0; l < mapRecupEpisodes.size(); l++) {
            		Episode episode = mapRecupEpisodes.get(l);
            		mapTot.put(episode.getNumero(), episode);
            	}
            }
            System.out.println(mapRecupEpisodes.size());
            for (int m = 0; m < mapRecupEpisodes.size(); m++) {
            	Episode episode = mapRecupEpisodes.get(m);
            	System.out.println(episode.getSaison() + " " + episode.getNumero());
            }
    a ce stade, avec cette méthode, c'est triéé par saison mais pas par épisode. 4 arrive après 38. Je vois pourquoi, mais je sais pas comment faire. Je crois qu'il me redéfinir equals, ou un truc du genre

    Et pour la méthode plus propre avec un objet Comparable, si quelqu'un a un exemple, je veux bien voir...

    Je vais laisser reposer. J'ai la sensation de foiré un truc.

  11. #11
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonsoir,

    Utilise un comparator

    EpisodeComparator .java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import java.util.Comparator;
     
    public class EpisodeComparator implements Comparator<Episode> {
     
    	public int compare(Episode episode1, Episode episode2) {
    		int result = episode1.getSaison().compareTo(episode2.getSaison());
    		if(result==0){
    			result = episode1.getNumero().compareTo(episode2.getNumero());
    		}
    		return result;
    	}
     
    }
    et pour le trie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		Map<Integer, Episode> mapRecupEpisodes = recupEpisodes(pathTxt);
    		List<Episode> episodes = new ArrayList<Episode>(mapRecupEpisodes.values());
    		Collections.sort(episodes, new EpisodeComparator());
    		for(Iterator<Episode> iterator = episodes.iterator(); iterator.hasNext(); ){
    			Episode episode = (Episode)iterator.next();
    			System.out.println(episode.getSaison()+" "+episode.getNumero());
    		}
    A+.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 33
    Points : 33
    Points
    33
    Par défaut
    Ca le fait nickel. Merci

    Je crois que j'avais saisi le concept du Comparator qu'à 80%.
    Le voir, c'est plus évident.

    J'ai juste modifié les types pour satisfaire à l'attente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public int compare(Episode episode1, Episode episode2) {
    		Integer result = new Integer(episode1.getSaison()).compareTo(new Integer(episode2.getSaison()));
    		if(result==0){
    			result = new Integer(episode1.getNumero()).compareTo(new Integer(episode2.getNumero()));
    		}
    		return result;
    	}

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

Discussions similaires

  1. [XL-2010] Moyenne d'une plage en fonction de deux critères
    Par Coxtox dans le forum Excel
    Réponses: 8
    Dernier message: 17/04/2018, 13h23
  2. [XL-2010] Déplacer une ligne dans une autre feuille en fonction de deux critères
    Par mikmak78 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/03/2015, 06h38
  3. [Toutes versions] Insertion d'une ligne en fonction de deux critères
    Par Oliiv dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/10/2012, 23h55
  4. [AC-2003] Parcourir une table en fonction de certains critères
    Par Shikam dans le forum VBA Access
    Réponses: 7
    Dernier message: 02/06/2010, 16h51
  5. Réponses: 1
    Dernier message: 08/02/2009, 18h04

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