Как отсортировать map по значению java
Отсортировать мап по значению можно преобразовав ее в LinkedHashMap или TreeMap :
import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; import java.util.stream.Collectors; public class App public static void main(String[] args) MapString, Integer> myMap = Map.of("Ivan", 2000, "Petr", 1990, "Egor", 1995); MapString, Integer> sortedMap1 = myMap.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new )); System.out.println(sortedMap1); // => MapString, Integer> sortedMap2 = new TreeMapString, Integer>( Comparator.comparing(myMap::get)); sortedMap2.putAll(myMap); System.out.println(sortedMap2); // => > >
Как отсортировать HashMap по значению?
Дано предложение, я его разбиваю по пробелу, в один массив записываю слова, в других количество попаданий введнного символа в слове.
Получается два массива, я их соединяю в хеш-таблицу, получается (слово => кол-во введенного символа)
Как её осортировать по значению?
- Вопрос задан более трёх лет назад
- 4119 просмотров
Комментировать
Решения вопроса 2
Сергей Горностаев @sergey-gornostaev Куратор тега Java
Седой и строгий
Вы можете добиться определённого порядка вывода элементов HashMap
words_counters.entrySet() .stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .forEach(System.out::println);
Но не отсортировать саму коллекцию, так как HashMap не гарантирует сохранения упорядоченности элементов.
Если нужна упорядоченная реализация Map используйте TreeMap или LinkedHashMap.
Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать

Sergey Shvyrev @CellycoMobiles
indi developer @CellycoMobiles
Простите с телефона. Но думаю ответ в области Streams.
Например :
map.entryset().stream() .sorted((entry1, entry2) -> customComparator.max(entry1.value, entry2.value)) .map(entry -> entry.getKey()) .collect(toList())
Сортировка map по значению java
карта это не то место где надо сортировать «по значению». в самом лучше случае можно вытащить map.values(), но внутри самой карты НИКАК. потому что позиция значений зависит от ключа(хеша ключа).
21 июн 2014 в 7:50
Насколько помню Java , если для реализации Map использовать TreeMap, то перебор членов коллекции будет происходить (по умолчанию) в порядке возрастания ключей. Таким образом, специально сортировать не потребуется.
21 июн 2014 в 10:37
@avp: Насколько я понимаю, ТС хочет сортировку не по ключам, а по значениям.
21 июн 2014 в 11:34
@VladD, точно. Невнимательно я прочел вопрос. — @ttt, а если абстрагироваться от программной реализации, то что, на самом деле, Вы хотите сделать? (лучше просто русскими словами).
21 июн 2014 в 11:43
6 ответов 6
Сортировка: Сброс на вариант по умолчанию
java 8
import java.util.Map; import java.util.HashMap; public class Main < public static void main(String[] args) < HashMapmap = new HashMap(); map.put(1, 10); map.put(2, 30); map.put(3, 50); map.put(4, 40); map.put(5, 100); map.put(6, 60); map.put(7, 110); map.put(8, 50); map.put(9, 90); map.put(10, 70); map.put(11, 80); map.entrySet().stream() .sorted(Map.Entry.comparingByValue().reversed()) .forEach(System.out::println); // или любой другой конечный метод > >
Вывод:
7=110 5=100 9=90 11=80 10=70 6=60 3=50 8=50 4=40 2=30 1=10
Отслеживать
ответ дан 11 мая 2017 в 20:20
802 1 1 золотой знак 9 9 серебряных знаков 25 25 бронзовых знаков
Если помог) апните ответ)
11 мая 2017 в 20:22
Map map = new HashMap<>(); List list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator() < @Override public int compare(Map.Entrya, Map.Entry b) < return a.getValue() - b.getValue(); >>); Исправил
Отслеживать
13.2k 1 1 золотой знак 28 28 серебряных знаков 28 28 бронзовых знаков
ответ дан 20 июн 2014 в 21:50
166 1 1 серебряный знак 10 10 бронзовых знаков
Вы потеряли информацию о ключах
21 июн 2014 в 6:43
Сходу написать такой сортировщик не так просто. По крайней мере, я для себя выбрал в этом случае такую стратегию: раз написал, много раз используй. Поэтому такой сортировщик я написал через Generics т.к. в map может иметь и другие типы в качестве ключа и значения.
Ниже я поделюсь двумя версиями сортировочного метода. Для Java version = 7 и для Java version = 8 .
Итак, если у Вас 7-я версия Java:
public static > Map sortByValue(Map map ) < List list = new LinkedList<>(map.entrySet()); Collections.sort( list, new Comparator() < @Override public int compare(Map.Entryo1, Map.Entry o2) < return (o1.getValue()).compareTo( o2.getValue() ); >> ); Map result = new LinkedHashMap<>(); for (Map.Entry entry : list) < result.put(entry.getKey(), entry.getValue()); >return result; >
Т.е., сначала, как писал @Nofate, вытаскиваем список entries (это у нас переменная list ), затем сортируем эти entries по значениям и заливаем в новую мапу (это у нас result ). Для результирующей мапы я использовал LinkedHashMap чтобы при добавлении элементы не пересортировывались.
А вот версия с использованием Stream ‘ов из Java 8:
public static > Map sortByValue( Map map ) < Mapresult = new LinkedHashMap<>(); Stream st = map.entrySet().stream(); st.sorted(Comparator.comparing(e -> e.getValue())) .forEach(e ->result.put(e.getKey(),e.getValue())); return result; >
Отслеживать
ответ дан 20 июл 2015 в 13:29
470 5 5 серебряных знаков 11 11 бронзовых знаков
Делаем два ArrayList-а с ключом и значением. Парсим HashMap, сразу сортируя по значению.
ArrayList strings = new ArrayList<>(); ArrayList floats = new ArrayList<>(); for (HashMap.Entry e : map.entrySet()) < float value = e.getValue(); boolean isAdded = false; for (int i = 0; i < floats.size(); i++) < if (value >floats.get(i)) < floats.add(i, value); strings.add(i, e.getKey()); isAdded = true; break; >> if (!isAdded) < floats.add(value); strings.add(e.getKey()); >> for (int i = 0; i < strings.size(); i++) < Log.d(TAG, "sort: " + strings.get(i) + " mt24">)" data-controller="se-share-sheet" data-se-share-sheet-title="Поделиться ссылкой на ответ" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter " data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f3.0%2f" data-se-share-sheet-license-name="CC BY-SA 3.0" data-s-popover-placement="bottom-start">Поделиться)" title="">Улучшить ответ)">изменён 25 фев 2018 в 8:44ответ дан 24 фев 2018 в 21:22 Alexey CheAlexey Che112 бронзовых знака