O MAP é uma coleção de pares de valor-chave, também conhecidos como dicionários ou matrizes associativas, etc., e é uma das estruturas de dados mais comuns. Como classificar um mapa por valor em java? Parece simples, mas não fácil!
Por exemplo, no mapa, a chave é o tipo de string, que representa uma palavra, e o valor é o tipo int, que representa o número de vezes que a palavra aparece. Agora queremos classificar pelo número de vezes que a palavra aparece:
Mapa mapa = new theemap (); map.put ("me", 1000); map.put ("e", 4000); map.put ("you", 3000); map.put ("comida", 10000); map.put ("faminto", 5000); map.put ("later", 6000); O resultado da classificação por valor deve ser:
Key Valueme 1000As 3000 e 4000hungth 5000Later 6000Food 10000
Primeiro de tudo, não podemos adotar a estrutura de mapa classificada, porque o SortedMap é um mapa classificado por teclas, não um mapa classificado pelo valor. O que queremos é um mapa classificado por valor.
Você não poderia fazer isso com um mapa classificado?
Não, porque o mapa está sendo classificado por suas chaves.
Método 1:
O seguinte código Java:
importar java.util.iterator; importar java.util.set; importar java.util.TreeSet; public class Main {public static void main (string [] args) {set set = new TreeSet (); set.add (novo par ("me", "1000")); set.add (novo par ("e", "4000")); set.add (novo par ("você", "3000")); set.add (New Par ("Food", "10000")); set.add (New Par ("Hungry", "5000")); set.add (New Par ("Later", "6000")); set.add (novo par ("me", "1000")); for (iterator i = set.iterator (); i.hasnext ();) system.out.println (i.next ()); }} classe par implementa Comparável {private final String Name; Número INT final privado; Public par (nome da string, número int) {this.name = name; this.Number = número; } Public par (nome da string, número da string) lança numberFormatexception {this.name = name; this.Number = Integer.ParseInt (número); } public int compareto (objeto o) {if (o instanceof par) {int cmp = duplo.comPare (número, ((par) o) .number); if (cmp! = 0) {return cmp; } retornar name.compareto (((par) o) .name); } lança o novo ClassCastException ("Não é possível comparar o par com" + o.getclass (). getName ()); } public string tostring () {retorna nome + '' + número; }} Código C ++ semelhante:
par typedef <string, int> par; int cmp (par de const & x, const par & y) {return x.second> y.second;} mapa <string, int> m; vetor <aM> vec; para (map <wstring, int> :: iterador curr = m.begin (); curr! Curr-> Segundo));} classificação (vec.begin (), vec.end (), cmp); O significado essencial do método acima é: encapsular o par de valores-chave (map.entry) na estrutura do mapa em uma classe personalizada (struct) ou use a classe Map.Entry diretamente. As classes personalizadas sabem como se classificar, ou seja, classificar por valor, implementar especificamente a interface comparável ou construir um objeto comparador para si mesmos e, em seguida, use um conjunto ordenado sem usar a estrutura do mapa (SortEdSet, o TreeSet é uma implementação do STORNEDSET), que tem o objetivo de classificar por valor no mapa. Ou seja, em vez de usar o mapa, o mapa.entry é considerado um objeto, para que o problema se torne implementar um conjunto ordenado do objeto ou classificar o conjunto do objeto. Você pode usar o StoredSet, para que, após a conclusão da inserção, ela seja naturalmente encomendada ou use uma lista ou matriz e, em seguida, classificá -la (coleções.sort () ou Arrays.sort ()).
Encapsular as informações em sua própria classe. Implementar
Regras comparáveis e de gravação para a ordem natural ou escreva um
Comparador com base em seus critérios. Armazene as informações em um classificado
Coleção ou use o método de coleções.sort ().
Método 2:
Você também pode usar o seguinte código para classificar por valor:
mapa estático público SortByValue (mapa) {list List = new LinkedList (map.entrySet ()); Coleções.sort (list, novo comparador () {public int compare (objeto o1, objeto o2) {return ((comparável) ((map.entry) (o1)). GetValue ()) .compareto (((map.entry) (o2)). GetValue ());}}}); Resultado do mapa = new LinkedHashMap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry Entry = (map.entry) it.next (); resultado.put (Entry.getKey (), entrada.getValue ()); } resultado de retorno; } mapa estático público SortByValue (mapa do mapa, reverso booleano final) {list list = new LinkedList (map.entrySet ()); Coleções.sort (list, novo comparador () {public int compare (objeto o1, objeto o2) {if (reverse) {return -((comparável) ((map.entry) (o1)). GetValue ()) .ComParto (((Map.entry) (o2)). .compareto (((map.entry) (o2)). getValue ()); Resultado do mapa = new LinkedHashMap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry Entry = (map.entry) it.next (); resultado.put (Entry.getKey (), entrada.getValue ()); } resultado de retorno; } Mapa mapa = new hashmap (); map.put ("A", 4); map.put ("b", 1); map.put ("c", 3); map.put ("D", 2); Mapa classificado = sortbyValue (mapa); System.out.println (classificado); // saída: {b = 1, d = 2, c = 3, a = 4} ou pode ser feito assim: mapa mapa = new hashmap (); map.put ("A", 4); map.put ("b", 1); map.put ("c", 3); map.put ("D", 2); SET <pap.entry <String, Integer>> TreeSet = new TreeSet <pap.entry <String, Integer>> (novo comparador <pp.entry <string, Integer >> () {public int compare (map.entry <string, inteiro> o1, map.entry <string, integger> o2) {Integer D1 = Integer> o2.getValue (); TreeSet.addall (map.entrySet ()); System.out.println (TreeSet); // saída: [a = 4, c = 3, d = 2, b = 1] Além disso, a implementação do mapa de classificação por valor em Groovy é, obviamente, a essência é a mesma, mas é muito simples:
Use o método de classificação de mapa no groovy (requer groovy 1.6).
def resultado = map.sort () {a, b -> b.value.compareto (a.value)} como:
["A": 3, "B": 1, "C": 4, "D": 2] .Sort {A, B -> A.Value - B.Value}
O resultado é: [b: 1, d: 2, a: 3, c: 4]
Semelhante em 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, v1) / v1, v1, v1, v1, v1, v1, v2, v1, v1), (k2, v2)]. ('B', 1)]O artigo acima fala brevemente sobre o mapa Java por valor é todo o conteúdo que compartilho com você. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.