Карта представляет собой набор пар ключевых значений, также известная как словары или ассоциативные массивы и т. Д., И является одной из наиболее распространенных структур данных. Как сортировать карту по значению в Java? Это кажется простым, но не легким!
Например, в карте ключом является тип строки, который представляет слово, а значение - тип int, который представляет количество раз, когда появляется слово. Теперь мы хотим сортировать по количеству раз, когда появляется слово:
Map map = new TreeMap (); map.put ("me", 1000); map.put ("и", 4000); map.put ("you", 3000); map.put ("еда", 10000); map.put («голодные», 5000); map.put («позже», 6000); Результатом сортировки по значению должно быть:
Ключевой Valueme 1000 You 3000 и 4000Hungry 5000Later 6000food 10000
Прежде всего, мы не можем принять структуру SortedMap, потому что SortedMap - это карта, сортируемая по ключам, а не карта, сортируемая по значению. Мы хотим, чтобы карта сортирована по значению.
Не могли бы вы сделать это с помощью карты?
Нет, потому что карта сортируется по ключам.
Метод 1:
Следующий код Java:
Import java.util.iterator; import java.util.set; import java.util.treeset; открытый класс main {public static void main (string [] args) {set set = new Treeset (); set.add (new Pair ("me", "1000")); set.add (new Pair ("и", "4000")); set.add (new Pair ("you", "3000")); set.Add (новая пара ("еда", "10000")); set.add (new Pair ("Hungry", "5000")); set.add (new Pair ("позже", "6000")); set.add (новая пара ("меня", "1000")); для (итератор i = set.iterator (); }} Пара классов реализует сопоставимо {private final String name; частный финальный номер; public pair (string name, int number) {this.name = name; this.number = число; } public pare (string name, string number) throws NumberFormateXception {this.name = name; this.number = integer.parseint (номер); } public int compareto (Object o) {if (o ancementOf pare) {int cmp = double.compare (number, ((pare) o) .number); if (cmp! = 0) {return cmp; } return name.compareto (((пара) o) .name); } бросить новое ClassCastException («не может сравнить пару с" + o.getClass (). getName ()); } public String toString () {return name + '' + number; }} Подобный код C ++:
PARY PARY <string, int> pair; int cmp (const pare & x, const pare & y) {return x.second> y.second;} map <string, int> m; vector <pare> vec; for (map <wstring, int> :: iterator curr = m.begin (); curr! curr-> second));} sort (vec.begin (), vec.end (), cmp); Основной значимостью вышеуказанного метода является: инкапсулировать пару клавишных значений (map.entry) в структуре карты в пользовательский класс (struct) или используйте класс Map.Entry напрямую. Пользовательские классы знают, как сортировать себя, то есть сортировать по значению, в частности, реализовать сопоставимый интерфейс или построить объект компаратора для себя, а затем используйте упорядоченный набор без использования структуры карты (сортируемый набор, Treesset является реализацией SortedSet), которая реализует цель сортировкой по значению на карте. То есть вместо использования map, map.Entry рассматривается как объект, так что проблема возникает для реализации упорядоченного набора объекта или сортировки набора объекта. Вы можете использовать SortedSet, так что после завершения вставки его, естественно, будет заказан, или использовать список или массив, а затем сортировать его (collections.sort () или Arrays.sort ()).
Инкапсулировать информацию в свой собственный класс. Либо реализация
Сопоставимы и правила записи для естественного упорядочения или написать
Компаратор на основе ваших критериев. Хранить информацию в отсортированном
Сбор или используйте метод collections.sort ().
Метод 2:
Вы также можете использовать следующий код для сортировки по значению:
Public Static Map SortByvalue (Map Map) {List List = new LinkedList (map.EntrySet ()); Collections.sort (list, new Compamator () {public int compare (Object O1, Object O2) {return ((complable) ((map.entry) (o1)). GetValue ()) .compareto (((map.entry) (o2)). GetValue ());}}); Map result = new LinkedHashmap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry entry = (map.entry) it.next (); result.put (entry.getKey (), intry.getValue ()); } return Result; } public Static Map sortByvalue (карта карты, окончательный Boolean Reverse) {List List = new LinkedList (map.EntrySet ()); Collections.sort (list, new Compерента () {public int compare (Object O1, Object o2) {if (reverse) {return -((complable) ((map.entry) (o1)). GetValue ()) .compareto ((((map.entry) (O2)). GetValue ());} return (comparable) (map.ent). .compareto (((map.Entry) (O2)). getValue ()); Map result = new LinkedHashmap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry entry = (map.entry) it.next (); result.put (entry.getKey (), intry.getValue ()); } return Result; } Map map = new hashmap (); map.put ("a", 4); map.put ("b", 1); map.put ("c", 3); map.put ("D", 2); Карта сортирован = sortbyvalue (map); System.out.println (сортирован); // Выход: {b = 1, d = 2, c = 3, a = 4} или это можно сделать так: map map = new hashmap (); map.put ("a", 4); map.put ("b", 1); map.put ("c", 3); map.put ("D", 2); SET <Map.Entry <String, Integer >> reeset = new Treeset <map.Entry <String, Integer >> (новый компаратор <map.Entry <String, integer >> () {public int compare (map.Entry <string, integer> o1, map.Entry <string, integer> o2) {integer d1 = o1. o2.getValue (); reeset.addall (map.entryset ()); System.out.println (Treesset); // Вывод: [a = 4, c = 3, d = 2, b = 1] Кроме того, реализация карты сортировки по значению в Groovy, конечно, сущность такая же, но она очень просто:
Используйте метод сортировки карты в Groovy (требуется Groovy 1.6).
def result = map.sort () {a, b -> b.value.compareto (a.value)} нравиться:
["a": 3, "b": 1, "c": 4, "D": 2] .sort {a, b -> a.value - b.value}
Результат: [B: 1, D: 2, A: 3, C: 4]
Похоже на 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 = (', 3),', ', 3):', 3): ',', 3): '. ('b', 1)]]Приведенная выше статья кратко рассказывает о сортировке карты Java по цене - это весь контент, которым я делюсь с вами. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.