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

Java Discussion :

Tri ordre décroissant par valeur dans une TreeMap


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut Tri ordre décroissant par valeur dans une TreeMap
    Bonjour

    Je dois recuperer une TreeMap qui stocke un String et un objet.
    Je voudrai trier par ordre croissant la date d'effet dans le deuxieme objet passé en parametre.
    avec le code ca sera plus comprehnsible.
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    import java.util.Collections;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.TreeMap;
     
    public class SortMapOnKeyStringExample {
     
    	public Sess sess ;
    	public TreeMap<String, Sess> myTreeMap= new TreeMap<String, Sess>(Collections.reverseOrder());
     
     
    	public SortMapOnKeyStringExample(){
     
    	}
     
    	public static <T> void main(String[] args) {
     
    		String date1 = "10/12/2014";
    		String date2 = "05/12/2014";
    		String date3 = "15/12/2015";
    		String date4 = "05/12/2013";
    		Sess s1= new Sess(date1, "2");
    		Sess s2= new Sess(date2, "3");
    		Sess s3= new Sess(date3, "1");
    		Sess s4= new Sess(date4, "4");
     
    		SortMapOnKeyStringExample sortEx= new SortMapOnKeyStringExample();
    		sortEx.myTreeMap.put("52", s1);
    		sortEx.myTreeMap.put("87", s2);
    		sortEx.myTreeMap.put("65", s3);
    		sortEx.myTreeMap.put("54", s4);
    		printMap(sortEx.myTreeMap);
     
    	}
     
    	public TreeMap<String, Sess> getReverseOrderTreeMap(TreeMap<String, Sess> sess){
    		TreeMap<String, Sess> result=null;
     
    		return result;
    	}
     
    	public static void printMap(Map<String, Sess> map) {
    		for (Map.Entry<String, Sess> entry : map.entrySet()) {
    			System.out.println(entry.getKey() 
                                          + " ---->" + entry.getValue().dateEffet +"---->"+ entry.getValue().description );
    		}
    	}
     
    }
    mon objet Sess est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Sess {
     
    	String dateEffet;
    	String description;
     
     
    	public Sess(String date, String desc){
    		this.dateEffet=date;
    		this.description=desc;
    	}
     
    }
    donc je voudrai trier par la date d'effet qui se trouve dans l'objet session.
    mais je ne sais pas comment faire.
    Le tri par ordre décroissant je veux dire.
    quand au type d'objet je peux pas changer car le programme est deja construit de cette maniere.
    Merci de votre aide pour les pistes.

    il faut que je puisse avoir à la fin ce ceci:

    65 ---->15/12/2015---->1
    52 ---->10/12/2014---->2
    87 ---->05/12/2014---->3
    54 ---->05/12/2013---->4

    ici c'est le parametre au milieu qui est en jeu.

    Merci

  2. #2
    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
    Hello,

    - #cas 1 : Si les données doivent être dans une TreeMap, c'est impossible. Une TreeMap ne trie que sur les clés, pas sur les valeurs. Les clés de ta TreeMap ne contiennent pas la date, donc c'est impossible.
    Les contraintes "ça doit être trié par date" et "ça doit être une TreeMap comme j'ai montré" ne sont pas tenables.

    - #cas 2 : Si ça doit être une Map, et que les clés et valeurs doivent être comme tu montres, mais que ça peut être n'importe quelle Map,
    tu peux t'en sortir en triant les données d'abord et en les mettant dans une LinkedHashMap. Une LinkedHashMap conserve les données dans l'ordre où elles y ont été mises :

    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
    Map<String, Sess> startMap = new HashMap<>();
    startMap.put("bidule", new Sess("chose", "truc"));
    // ... On remplit la Map
     
    // on met les Entry de la Map dans une List.
    List<Map.Entry<String, Sess>> entryList = new ArrayList<>(startMap.entrySet());
     
    // on trie la List, par ordre décroissant
    Collections.sort(entryList, (e1, e2) -> e2.getValue().dateEffet.compareTo(e1.getValue().dateEffet));
     
    // on insère les Entry dans l'ordre dans une LinkedHashMap :
    Map<String, Sess> sortedMap = new LinkedHashMap<>();
    entryList.forEach( entry -> sortedMap.put(entry.getKey(), entry.getValue()) );
     
    // on affiche la map : les données sont dans l'ordre
    System.out.println(sortedMap);
    Il y a juste le petit problème que tes dates sont des String au lieu d'être des LocalDate, et qu'elles ne sont pas dans un format d'ordre lexicographique (elles sont "jj/mm/aaaa" alors que le tri naturel serait sur "aaaa/mm/jj".)
    Du coup tu ne peux pas utiliser la comparaison naturelle des String comme je le fais, il va te falloir faire ton propre Comparator<String> qui sait comparer tes String comme si c'était des LocalDate. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private static final DateTimeFormatter stringDateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    private static final Comparator<String> stringDateComparator = (string1, string2) -> {
      LocalDate date1 = LocalDate.parse(string1, stringDateFormatter);
      LocalDate date2 = LocalDate.parse(string2, stringDateFormatter);
      return date1.compareTo(date2);
    };
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Merci thelvin,
    Je suis perdue.
    Je sais plus quoi faire
    qqn peut me dire ou ça foire?Je n'arrive pas a faire marcher mon script
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.TreeMap;
     
    public class SortTreeMap implements Comparable<SortTreeMap>{
    	TreeMap<String, Sess> treeMap= new TreeMap<String, Sess>();
    	public Sess persone;
     
    	public SortTreeMap(){
    		initialse();
    	}
    	@Override
    	public int compareTo(SortTreeMap o1) {
    		return this.persone.dateEffet.compareTo(o1.persone.dateEffet);
    	}
     
     
    	public void initialse(){
    		Sess p1= new Sess("01/12/2015","01" );
    		Sess p2= new Sess("01/12/2013","04");
    		Sess p3= new Sess("01/12/2014","03");
    		Sess p4= new Sess("28/12/2014","02" );
    		treeMap.put("3", p1);
    		treeMap.put("2", p4);
    		treeMap.put("4", p3);
    		treeMap.put("1", p2);
    	}
    	private void print(Map<String, Sess> sortedMap) {
    		for (Map.Entry<String, Sess> entree : treeMap.entrySet()) {
    			System.out.println(entree.getKey()+" ----> "+entree.getValue().dateEffet);
    		}
    	}
     
    	public void orderByDesc(){
    		Map<String, Sess> startMap = new HashMap<String, Sess>();
    		List<Map.Entry<String, Sess>> entryList = new ArrayList<>(startMap.entrySet());
    		//print(entryList);
    		// on trie la List, par ordre décroissant
    		Collections.sort(entryList, (e1, e2) -> e2.getValue().dateEffet.compareTo(e1.getValue().dateEffet));
    		// on insère les Entry dans l'ordre dans une LinkedHashMap :
    		Map<String, Sess> sortedMap = new LinkedHashMap<>();
    		entryList.forEach( entry -> sortedMap.put(entry.getKey(), entry.getValue()) );
    		// on affiche la map : les données sont dans l'ordre
    		print(sortedMap);
     
    	}
     
    	public static void main(String[] args)
    	{
    		SortTreeMap sortt= new SortTreeMap();
    		sortt.orderByDesc();
    	}
     
     
     
     
     
     
    }
    Merci

  4. #4
    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
    Problème numéro 1 : tu n'as rien mis du tout dans startMap.
    Il faut que ta méthode initialize(), qui remplit les données de départ, les mettre dans la HashMap qui sera startMap.

    Problème numéro 2 : apparemment tu essaies encore d'avoir une TreeMap. Comme je te l'ai dit, il faut oublier cette idée.

    (Ensuite il y a le fait que tu continues d'utiliser le compareTo() des String comme montré dans mon code, ce qui ne marchera pas puisque tu ne peux pas utiliser l'ordre naturel des String.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Mars 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 21
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Petite question pour Tifsa,

    Le résultat de ton tri, que veux-tu en faire ? Pour l'instant cela ne m'a pas l'air très clair.
    Si c'est juste en faire une sortie genre affichage, ou manipuler les données une fois ordonnées, il n'y a peut-être pas besoin de s'embêter.

    A mon avis la bonne solution à ton problème dépendra vraiment de ce que tu veux faire de tes données.

    Pierre

  6. #6
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Bonjour Pierre et Thelvin,
    Le code à ete developpé par une equipe depuis 15ans et je dois pas trop changer la structure.
    Je dois cibler l'endroit.
    ceci dit, avec les conseils de Thevin j'ai reussi.
    J'ai implementé un comparator dans ma class Sess ou je fais la comparaison de deux champs date par ordre croissant.
    je recupere la liste sans faire de modif.
    J'ai galeré a trouver la solution car j'avais un gros probleme avec mon Eclipse
    mais finalement tout est resolu.
    Merci infiniment

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/02/2011, 16h39
  2. [AC-2003] Cumul décroissant de valeurs dans une requête
    Par Piccou dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/08/2009, 21h29
  3. Sélection valeur par défaut dans une zone de liste
    Par Cécile154 dans le forum IHM
    Réponses: 2
    Dernier message: 15/02/2005, 18h20
  4. Valeur par défaut dans une table objet
    Par Ricky81 dans le forum Oracle
    Réponses: 12
    Dernier message: 18/03/2004, 11h52
  5. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34

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