В прошлой статье я показал вам, как сортировать карту в Java 8 по ключам, и сегодня я научу вас, как сортировать карту по значениям с помощью функций Java 8, например, лямбда-выражения, ссылки на метод, потоков и новых методов. добавлен в классы java.util.Comparator и Map.Entry. Чтобы отсортировать любую карту, например HashMap , Hashtable, LinkedHashMap, TreemMap или даже ConcurrentHashMap , вы можете сначала получить набор записей с помощью метода entrySet (), а затем вы можете получить поток, вызвав метод stream (). Метод entrySet () возвращает Set, который наследует метод stream () из класса java.util.Collection. Получив поток, вы можете просто вызвать метод sorted (), который может отсортировать все объекты Map.Entry, доступные в Stream, с помощью Comparator .
Чтобы сравнить записи Map по значениям, вы можете использовать недавно добавленный метод Map.Entry.comparingByValue () из класса java.util.Map.Entry.
Это аналог метода comparingByKey (), который мы использовали в предыдущей статье . Оба эти метода перегружены для работы с объектами Comparable и Comparator.
После сортировки потока вы можете делать все, что хотите, например, если вы просто хотите печатать ключи, значения или записи в отсортированном порядке, просто используйте метод forEach () или если вам нужна карта, которая сортируется по значениям, тогда Вы можете использовать метод collect () класса потока.
Этот метод принимает Collector и позволяет вам захватывать все элементы Stream в любую коллекцию, которую вы хотите. Например, если вам нужна отсортированная карта, вы можете использовать метод toMap () класса java.util.stream.Collectors.
Этот метод перегружен и предоставляет несколько вариантов, например, вы можете собирать записи на карте любого типа или также можете указать тип карты, которую вы хотите, например, для хранения записей в отсортированном порядке, мы будем использовать LinkedHashMap . Это также позволяет разорвать связи в случае одинаковых значений, например, вы можете расположить их в том порядке, в котором вы хотите.
Кстати, если вам интересно, вы также можете увидеть курс Pluralsight « От коллекций к потокам в Java 8» Использование курса « Лямбда-выражения», чтобы узнать больше о новых функциях Java 8, специфичных для инфраструктуры коллекций.
Вкратце, вот точные шаги для сортировки HashMap в Java 8 по значениям в порядке возрастания или убывания, при условии, что у вас уже есть объект карты
- Получить набор записей, вызвав метод Map.entrySet ()
- Получить поток записей, вызвав метод stream ()
- Вызвать отсортированный метод с помощью компаратора
- Используйте компаратор Map.Entry.comparingByValue () для сортировки записей по значениям
- Соберите результат, используя метод collect ()
- Используйте метод Collectors.toMap (), чтобы получить результат на другой карте.
- Укажите LinkedHashMap :: new для последнего параметра, чтобы он возвращал LinkedHashMap, чтобы сохранить отсортированный порядок
- Чтобы отсортировать в порядке убывания, просто измените порядок Comparator, используя метод Collections.reverseOrder () или Comparator.reverse () Java 8. См. Java SE 8 для Really Impatient для полного списка новых методов, добавленных в ключевые классы Java. например, Java Collection Framework, String, Comparator и т. д.
После выполнения этого шага вы получите карту, которая отсортирована по значениям. Теперь, когда вы знаете теорию и шаги, давайте рассмотрим пример кода в следующем разделе, чтобы понять это правильно.
Java программа для сортировки карты по значениям
Вот наша полная Java-программа для сортировки Map по значениям с использованием функций Java 8, например, новых методов в существующих классах в Java 8 путем их развития с использованием методов по умолчанию и статических методов на интерфейсах. В этом примере у меня есть карта карты предметов и их расходов, например, аренды, коммунальных услуг, транспорта и т. Д. Ключ карты — это строка , которая представляет элемент, а значение — целое число, то есть расходы. Наша задача — отсортировать карту по значениям, чтобы выяснить, какой элемент нам дороже всего, и распечатать все элементы в порядке убывания значений.
01
02
03
04
05
06
07
08
09
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import static java.util.stream.Collectors.*; import static java.util.Map.Entry.*; /* * Java Program to sort a Map by values in Java 8 * */ public class Main { public static void main(String[] args) throws Exception { // a Map with string keys and integer values Map<String, Integer> budget = new HashMap<>(); budget.put( "clothes" , 120 ); budget.put( "grocery" , 150 ); budget.put( "transportation" , 100 ); budget.put( "utility" , 130 ); budget.put( "rent" , 1150 ); budget.put( "miscellneous" , 90 ); System.out.println( "map before sorting: " + budget); // let's sort this map by values first Map<String, Integer> sorted = budget .entrySet() .stream() .sorted(comparingByValue()) .collect( toMap(e -> e.getKey(), e -> e.getValue(), (e1, e2) -> e2, LinkedHashMap:: new )); System.out.println( "map after sorting by values: " + sorted); // above code can be cleaned a bit by using method reference sorted = budget .entrySet() .stream() .sorted(comparingByValue()) .collect( toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap:: new )); // now let's sort the map in decreasing order of value sorted = budget .entrySet() .stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) .collect( toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap:: new )); System.out.println( "map after sorting by values in descending order: " + sorted); } } Output map before sorting: {grocery= 150 , utility= 130 , miscellneous= 90 , rent= 1150 , clothes= 120 , transportation= 100 } map after sorting by values: {miscellneous= 90 , transportation= 100 , clothes= 120 , utility= 130 , grocery= 150 , rent= 1150 } map after sorting by values in descending order: {rent= 1150 , grocery= 150 , utility= 130 , clothes= 120 , transportation= 100 , miscellneous= 90 } |
Вы можете видеть, что перед сортировкой карта имеет случайный порядок в терминах значений, но сначала мы отсортировали их в порядке возрастания значений, а затем мы отсортировали ту же карту в порядке убывания значений, поэтому рента стоит на первом месте, потому что это стоило нам самого высокого.
Некоторые советы
1) Используйте статический импорт для сокращения кода, вы можете статически импортировать оба класса Map.Entry и Collectors.
2) Используйте ссылку на метод вместо лямбда-выражения везде, где вы можете. См. Эту статью, чтобы узнать больше о том, как преобразовать лямбда-выражение в ссылку на метод в Java 8, если вы не знакомы с этим.
Это все о том, как отсортировать карту по значениям в Java 8 . Вы можете видеть, что так легко сортировать карту, используя новые методы, добавленные к существующим классам. Все это возможно благодаря стандартной функции JDK 8, которая позволяет добавлять новые методы в существующие классы. До этого улучшения в Java не было возможности без нарушения существующего клиента интерфейсов, потому что, как только вы добавляете в интерфейс новый метод, все его клиенты должны были его реализовать. Это больше не требуется, если метод является стандартным или статическим, потому что они не абстрактные, а конкретные методы.
Дальнейшее чтение
Java SE 8 для действительно нетерпеливых
От коллекций к потокам в Java 8 с помощью лямбда-выражений
Связанные руководства по Java 8
Если вы хотите узнать больше о новых возможностях Java 8, вот мои предыдущие статьи, в которых рассматриваются некоторые важные концепции Java 8:
- 5 книг для изучения Java 8 с нуля ( книги )
- Что такое метод по умолчанию в Java 8? ( пример )
- Как присоединиться к String в Java 8 ( пример )
- Как использовать метод filter () в Java 8 ( учебник )
- Как отформатировать / проанализировать дату с LocalDateTime в Java 8? ( учебник )
- Как использовать класс Stream в Java 8 ( учебник )
- Как преобразовать Список в Карту в Java 8 ( решение )
- Разница между абстрактным классом и интерфейсом в Java 8? ( ответ )
- 20 примеров даты и времени в Java 8 ( учебное пособие )
- Как использовать метод peek () в Java 8 ( пример )
- Как отсортировать карту по ключам в Java 8? ( пример )
- Как отсортировать май по значениям в Java 8? ( пример )
- 10 примеров необязательных в Java 8? ( пример )
Спасибо за чтение этой статьи до сих пор. Если вам понравилась эта статья, пожалуйста, поделитесь с друзьями и коллегами. Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте комментарий.
Ссылка: | Java 8 — сортировка HashMap по значениям в порядке возрастания и убывания от нашего партнера по JCG Явина Пола в блоге Javarevisited . |