Bonjour,
J'ai besoin de trier une map sur les valeurs de façon décroissante.
La clé est un String.
La valeur est un Integer.
Comment procéder ?
merci d'avance.
Bonjour,
J'ai besoin de trier une map sur les valeurs de façon décroissante.
La clé est un String.
La valeur est un Integer.
Comment procéder ?
merci d'avance.
En implémentant une classe Comparator comme ceci :
A adapter bien sûr :
Bon courage
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 public class CollectionComparator { static final Comparator ORDRE_DATE = new Comparator() { public int compare(Object o1, Object o2){ if(!(o1 instanceof Video)) throw new ClassCastException(); return (new Integer(((Video)o1).obtenirAnnee())).compareTo( new Integer(((Video)o2).obtenirAnnee())); } }; static final Comparator ORDRE_REALISATEUR = new Comparator() { public int compare(Object o1, Object o2){ if(!(o1 instanceof Video)) throw new ClassCastException(); return (((Video)o1).obtenirRealisateur()).compareTo( ((Video)o2).obtenirRealisateur()); } }; public static void main(String[] args) { TreeSet t = new TreeSet(); t.add(new Video("Le jour le plus long", "Ken Annakin", 1962)); t.add(new Video("Un pont trop loin", "Richard Attenborough", 1977)); t.add(new Video("Platoon", "Oliver Stone", 1986)); t.add(new Video("Full metal jacket", "Stanley Kubrik", 1987)); t.add(new Video("La ligne rouge", "Terrence Malick", 1998)); t.add(new Video("The patriot", "Roland Emmerich", 2000)); System.out.println("Tri par titre :\n" + t); TreeSet tr = new TreeSet(ORDRE_REALISATEUR); tr.addAll(t); System.out.println("\nTri par réalisateur :\n" + tr); TreeSet ta = new TreeSet(ORDRE_DATE); ta.addAll(t); System.out.println("\nTri par année :\n" + ta); } }
A noter que la solution que je te donne est à adapter.
Merci elitost,
Ton code m'a bien aidé.
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 private static Map sortMap(Map aMap) { Map myMap = new HashMap(); TreeSet set = new TreeSet(new Comparator(){ public int compare(Object obj, Object obj1) { Integer val1 = (Integer) ((Map.Entry) obj).getValue(); Integer val2 = (Integer) ((Map.Entry) obj1).getValue(); return val1.compareTo(val2); } }); set.addAll(aMap.entrySet()); for(Iterator it = set.iterator(); it.hasNext() ;) { Map.Entry myMapEntry = (Map.Entry) it.next(); myMap.put(myMapEntry.getKey(), myMapEntry.getValue()); } return myMap; }








Bonjour,
J'ai essayé de reprendre votre code car je voudrais trier une Map de façon croissante mais j'ai un petit soucis !!
Voici mon code:
Mon probleme est que les deux lignes suivantes ne me donne pas le même résultat:
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
27private void sortMap(Map aMap) { Map myMap = new HashMap(); Set set = new TreeSet( new Comparator() { public int compare(Object obj, Object obj1) { Integer val1 = (Integer) ((Map.Entry) obj).getValue(); Integer val2 = (Integer) ((Map.Entry) obj1).getValue(); if (val2.compareTo(val1)==0) return -1; return val2.compareTo(val1); } } ); set.addAll(aMap.entrySet()); for(Iterator it = set.iterator(); it.hasNext() ;) { Map.Entry myMapEntry = (Map.Entry) it.next(); System.out.println ( myMapEntry.getKey ( ) + " = " + myMapEntry.getValue ( ) ) ; myMap.put( myMapEntry.getKey(), myMapEntry.getValue()); } System.out.println("MyMap: "+myMap.values()); }
System.out.println (myMapEntry.getKey()+"="+myMapEntry.getValue()) ;
System.out.println("MyMap: "+myMap.values());
En effet, la premiere ligne me donne les résultats dans l'ordre croissant comme je le désire, alors que la deuxieme me donne les résultats dans le sens inverse (en faite elle me donne le résultats toujours dans l'ordre décroissant)
Je ne comprend pas d'ou vient cette erreur. On dirait que la fonction "put" met les réultats toujours dans le même ordre.
Il est également fortement possible que j'ai mal compris le code, en effet je ne suis pas familier avec les comparator.
Pourriez-vous m'aider s'il vous plait.
Merdi beaucoup pour votre aide.
Bonjour,
Moi aussi j'ai essayé le code et ça marche pas est ce que vous pouvez m'aider.
En fait je pense que ça marche que sur le key.
Merci de votre aide.
Bonjour,
J'ai le même problème. J'ai réussi à en résoudre une partie mon problème c'est que dans mon HashMap peux posseder des clés différentes mais les même valeurs du coups votre méthode ne marche plus. Quelqu'un a une idée ??
Voila mon code
Résultat :
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 import java.util.*; import java.lang.*; public class test { public static void main(String[] args) { Map< String, Integer> tm = new HashMap< String, Integer>(); tm.put("A", new Integer(3)); tm.put("B", new Integer(1)); tm.put("C", new Integer(3)); tm.put("D", new Integer(5)); Map myMap = new HashMap(); TreeSet set = new TreeSet(new Comparator(){ public int compare(Object obj, Object obj1) { Integer val1 = (Integer) ((Map.Entry) obj).getValue(); Integer val2 = (Integer) ((Map.Entry) obj1).getValue(); return val1.compareTo(val2); } }); set.addAll(tm.entrySet()); for(Iterator it = set.iterator(); it.hasNext() ;) { Map.Entry myMapEntry = (Map.Entry) it.next(); System.out.println(myMapEntry.getKey() + " " + myMapEntry.getValue()); myMap.put(myMapEntry.getKey(), myMapEntry.getValue()); } } }
B 1
A 3
D 5
??
Dans ce cas il faut insérer les éléments dans une List au lieu d'un Set.
Et comme une List ne se trie pas toute seule, il faut la faire trier en appelant Collections.sort() en lui passant la List à trier et le Comparator à utiliser.
C'est bien si ça fonctionne alors.
Bon courage
Partager