MAP est une collection de paires de valeurs clés, également appelées dictionnaires ou tableaux associatifs, etc., et est l'une des structures de données les plus courantes. Comment trier une carte par valeur en Java? Cela semble simple, mais pas facile!
Par exemple, dans MAP, la clé est le type de chaîne, qui représente un mot, et la valeur est le type int, qui représente le nombre de fois que le mot apparaît. Maintenant, nous voulons trier par le nombre de fois que le mot apparaît:
Map map = new Treemap (); map.put ("me", 1000); map.put ("et", 4000); map.put ("vous", 3000); map.put ("aliments", 10000); map.put ("Hungry", 5000); map.put ("plus tard", 6000); Le résultat du tri par valeur doit être:
Valueme clé 1000you 3000 et 4000Hungry 5000later 6000food 10000
Tout d'abord, nous ne pouvons pas adopter la structure triée, car TriEdMap est une carte triée par les clés, pas une carte triée par valeur. Ce que nous voulons, c'est une carte triée par valeur.
Ne pourriez-vous pas faire cela avec un trier?
Non, car la carte est triée par ses clés.
Méthode 1:
Le code Java suivant:
import java.util.iterator; import java.util.set; import java.util.treeset; public class main {public static void main (String [] args) {set set = new Treeset (); set.add (nouvelle paire ("me", "1000")); set.add (nouvelle paire ("et", "4000")); set.add (nouvelle paire ("vous", "3000")); set.add (nouvelle paire ("aliments", "10000")); set.add (nouvelle paire ("Hungry", "5000")); set.add (nouvelle paire ("plus tard", "6000")); set.add (nouvelle paire ("moi-même", "1000")); for (iterator i = set.iterator (); i.hasnext ();) System.out.println (i.next ()); }} La paire de classe implémente comparable {nom de chaîne finale privée; numéro d'int final privé; public paire (name de chaîne, numéro int) {this.name = name; this.number = nombre; } public paire (nom de chaîne, numéro de chaîne) lève NumberFormatexception {this.name = name; this.number = Integer.ParseInt (numéro); } public int compareto (objet o) {if (o instanceof pair) {int cmp = double.compare (nombre, ((paire) o) .number); if (cmp! = 0) {return cmp; } return name.compareto (((paire) o) .name); } lancez new classCastException ("Impossible de comparer la paire avec" + o.getClass (). getName ()); } public String toString () {Nom de retour + '' + numéro; }} Code C ++ similaire:
Typedef Pair <String, int> paire; int cmp (const pair & x, const pair & y) {return x.second> y.second;} map <string, int> m; vector <pair> vec; for (map <wstring Curr-> seconde));} Sort (ve.begin (), ve.end (), cmp); La signification essentielle de la méthode ci-dessus est: encapsuler la paire de valeurs clés (Map.Entry) dans la structure de la carte dans une classe personnalisée (struct), ou utiliser directement la classe Map.Entry. Les classes personnalisées savent comment se trier, c'est-à-dire trier par valeur, implémenter spécifiquement l'interface comparable ou construire un objet de comparaison pour eux-mêmes, puis utiliser un ensemble ordonné sans utiliser la structure de carte (SortEdSet, Treeset est une implémentation de SORDSET), qui réalise le but en nature par valeur dans la carte. C'est-à-dire que, au lieu d'utiliser MAP, Map.Entry est considéré comme un objet, afin que le problème devienne implémenter un ensemble ordonné de l'objet ou de trier l'ensemble de l'objet. Vous pouvez utiliser SortEdSet, de sorte qu'après l'insertion terminée, il sera naturellement commandé, ou utilisera une liste ou un tableau, puis le trier (Collection.Sort () ou Arrays.Sort ()).
Encapsuler les informations dans sa propre classe. Soit mettre en œuvre
Règles comparables et d'écriture pour l'ordre naturel ou rédiger un
Comparateur en fonction de vos critères. Stocker les informations dans un tri
Collection ou utilisez la méthode Collection.Sort ().
Méthode 2:
Vous pouvez également utiliser le code suivant pour trier par valeur:
Public Static Map SortByValue (Map Map) {list list = new LinkedList (map.EntrySet ()); Collection.Sort (List, nouveau comparateur () {public int compare (objet O1, objet o2) {return ((comparable) ((map.entry) (o1)). GetValue ()) .Compareto (((map.entry) (o2)). GetValue ());}}); Map result = new LinkedHashMap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry entrée = (map.entry) it.next (); result.put (entry.getKey (), entry.getValue ()); } Retour Résultat; } public static map sortByValue (map map, final booléen reverse) {list list = new LinkedList (map.entryset ()); Collection.Sort (List, nouveau comparateur () {public int compare (objet O1, objet o2) {if (revers) {return - ((comparable) ((map.entry) (o1)). GetValue ()) .Compareto (((map.entry) (o2)). GetValue ());} return ((comparable) ((map.entRy) (o1).). .Compareto (((map.entry) (o2)). getValue ());}}); Map result = new LinkedHashMap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry entrée = (map.entry) it.next (); result.put (entry.getKey (), entry.getValue ()); } Retour Résultat; } Map map = new hashmap (); map.put ("a", 4); map.put ("b", 1); map.put ("C", 3); map.put ("d", 2); Map trid = sortByValue (map); System.out.println (tri); // output: {b = 1, d = 2, c = 3, a = 4} ou il peut être fait comme ceci: map map = new hashmap (); map.put ("a", 4); map.put ("b", 1); map.put ("C", 3); map.put ("d", 2); Set <map.entry <string, entier >> arreset = new Treeset <map.entry <string, enter >> (nouveau comparateur <map.entry <string, enter >> () {public int compare (map.entry <sthing, enter> o1, map.entry <string, enter> o2) {enter d1 = o1.getvalue (); O2.GetValue (); int r = d2.compareto (D1); TreeSet.Addall (map.EntrySet ()); System.out.println (Treeset); // sortie: [a = 4, c = 3, d = 2, b = 1] De plus, la mise en œuvre de la carte de tri par valeur dans Groovy est bien sûr que l'essence est la même, mais elle est très simple:
Utilisez la méthode de tri de MAP dans Groovy (nécessite Groovy 1.6).
def result = map.sort () {a, b -> b.value.compareto (a.value)} comme:
["A": 3, "B": 1, "C": 4, "D": 2] .Sort {A, B -> A.Value - B.Value}
Le résultat est: [b: 1, d: 2, a: 3, c: 4]
Similaire dans Python:
h = {"a": 2, "b": 1, "c": 3} i = h.items () // i = [('a', 2), ('c', 3), ('b', 1)] i.sort (lambda (k1, v1), (k2, v2): cmp (v2, v1)) // i = [('C', "," a ', 2), 2)) // i = [(' C ', "," a', 2), 2), 2), 2). ('b', 1)]L'article ci-dessus parle brièvement de la carte de la carte Java est tout le contenu que je partage avec vous. J'espère que cela pourra vous donner une référence et j'espère que vous pourrez soutenir Wulin.com plus.