Java map найти максимальное значение

Find Smallest and Largest Value in a Map

This Java tutorial will discuss different techniques to find the smallest and largest value in HashMap. We will discuss techniques from simple iterations, Collections and Stream APIs. We will be using the following Map for examples.

Map map = Map.of("key1", 100, "key2", 200, "key3", 300);

Java streams provide a lot of useful classes and factory methods for performing various reduction operations. Here we have used Stream.max() which returns the maximum element of the stream based on the Comparator that compares Map.Entry in natural order on value. Similarly, we can use Stream.min() which returns the minimum value in the map.

Optional> maxEntry = map.entrySet().stream().max(Map.Entry.comparingByValue()); Integer maxValue = maxEntry.get().getValue(); Optional> minEntry = map.entrySet().stream().min(Map.Entry.comparingByValue()); Integer minValue = minEntry.get().getValue(); 

This is one of the straightforward and easy ways to find the smallest & largest value from a Map. The Collections class provides max() and min() methods that use the specified Comparator to find the smallest or the largest entry from the Map.

In the given example, all the elements in the collection are mutually Comparable and thus return the max/min element.

Entry maxEntry = Collections.max(map.entrySet(), Comparator.comparing(Entry::getValue)); Integer maxValue = maxEntry.getValue(); Entry minEntry = Collections.min(map.entrySet(), Comparator.comparing(Entry::getValue)); Integer minValue = minEntry.getValue(); 

In this approach, we need to iterate over the elements of the provided map to pick the lowest/highest element and store them in a variable. Note that this approach is inefficient when the number of occurrences of the element is high.

Entry maxEntry = null; Entry minEntry = null; for (Map.Entry currentEntry : map.entrySet()) < if (maxEntry == null || currentEntry.getValue() >maxEntry.getValue()) < maxEntry = currentEntry; >else < minEntry = currentEntry; >> Integer maxValue = maxEntry.getValue(); Integer minValue = minEntry.getValue(); 

In this short Java tutorial, we learned the different ways to find the minimum and the maximum value in a map using different techniques from iteration to Stream APIs. The efficient way to find the smallest and largest value is by using Stream API or by using collections instead of iterating the elements one by one.

Читайте также:  Program php on android

Источник

Поиск наибольшего значения в карте Java

Взгляните на способы нахождения максимального значения в структуре карты Java.

1. Обзор

В этом кратком руководстве мы рассмотрим различные способы поиска максимального значения в Java Map . Мы также увидим, как новые функции в Java 8 упростили эту операцию.

Прежде чем мы начнем, давайте кратко расскажем, как сравниваются объекты в Java.

Обычно объекты могут выражать естественный порядок, реализуя метод compareTo() из интерфейса Comparable . Однако порядок, отличный от естественного порядка, может быть использован через объект Comparator . Мы увидим это более подробно, когда продолжим.

2. До Java 8

Давайте сначала рассмотрим, как мы можем найти наивысшее значение без функций Java 8.

2.1. Использование Простой Итерации

Используя итерацию, мы могли бы просто просмотреть все записи Map , чтобы выбрать самое высокое значение, сохранив текущее самое высокое значение в переменной:

public > V maxUsingIteration(Map map) < Map.EntrymaxEntry = null; for (Map.Entry entry : map.entrySet()) < if (maxEntry == null || entry.getValue() .compareTo(maxEntry.getValue()) >0) < maxEntry = entry; >> return maxEntry.getValue(); >

Здесь мы также используем дженерики Java для создания метода, который может быть применен к различным типам.

2.2. Использование коллекций.max()

Теперь давайте посмотрим, как служебный метод max() в классе Collections может избавить нас от написания многих из этого самостоятельно:

public > V maxUsingCollectionsMax(Map map) < EntrymaxEntry = Collections.max(map.entrySet(), new Comparator>() < public int compare(Entrye1, Entry e2) < return e1.getValue() .compareTo(e2.getValue()); >>); return maxEntry.getValue(); > 

В этом примере мы передаем объект Comparator в max () |, который может использовать естественный порядок значений Entry через compareTo() или реализовать совершенно другой порядок.

3. После Java 8

Функции Java 8 могут упростить вашу попытку получить максимальное значение из Map несколькими способами.

3.1. Использование Collections.max() с лямбда-выражением

Давайте начнем с изучения того, как лямбда-выражения могут упростить вызов Collections.max() :

public > V maxUsingCollectionsMaxAndLambda(Map map) < EntrymaxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue() .compareTo(e2.getValue())); return maxEntry.getValue(); >

Как мы видим здесь, лямбда-выражения избавляют нас от определения полноценного функционального интерфейса и обеспечивают краткий способ определения логики. Чтобы узнать больше о лямбда-выражениях, также ознакомьтесь с нашей предыдущей статьей .

3.2. Использование потока

API Stream является еще одним дополнением к Java 8 , которое в значительной степени упростило работу с коллекциями:

public > V maxUsingStreamAndLambda(Map map) < Optional> maxEntry = map.entrySet() .stream() .max((Entry e1, Entry e2) -> e1.getValue() .compareTo(e2.getValue()) ); return maxEntry.get().getValue(); > 

Этот API предлагает множество запросов обработки данных, таких как map-reduce преобразования в коллекциях. Здесь мы использовали max() над потоком Записи карты , что является частным случаем операции сокращения. Более подробная информация о Stream API доступна здесь .

Мы также используем здесь Необязательный API, который представляет собой объект-контейнер, добавленный в Java 8, который может содержать или не содержать ненулевое значение. Более подробную информацию о Необязательно можно получить здесь .

3.3. Использование потока со ссылкой на метод

Наконец, давайте посмотрим, как ссылки на методы могут еще больше упростить использование лямбда-выражений:

public > V maxUsingStreamAndMethodReference(Map map) < Optional> maxEntry = map.entrySet() .stream() .max(Comparator.comparing(Map.Entry::getValue)); return maxEntry.get() .getValue(); > 

В тех случаях, когда лямбда-выражения просто вызывают существующий метод, ссылка на метод позволяет нам сделать это, используя имя метода напрямую. Для получения более подробной информации о ссылках m ethod взгляните на эту предыдущую статью .

4. Заключение

В этой статье мы рассмотрели несколько способов найти наибольшее значение в Java Map , некоторые из которых использовали функции , добавленные в Java 8.

Как всегда, код для примеров доступен на GitHub .

Читайте ещё по теме:

Источник

Нахождение наибольшего значения на карте Java

В этом кратком руководствеwe’ll explore various ways to find the maximum value in a Java Map. Мы также увидим, как новые функции вJava 8 упростили эту операцию.

Прежде чем мы начнем, давайте кратко рассмотрим, какobjects are compared в Java.

Обычно объекты могут выражать естественный порядок путем реализации методаcompareTo() из интерфейсаComparable. Однако через объектComparator можно использовать другой порядок, а не естественный. Мы увидим их более подробно в дальнейшем.

2. До Java 8

Давайте начнем сначала с изучения того, как мы можем найти максимальную ценность без функций Java 8.

2.1. Использование простой итерации

Используя итерацию, мы могли бы просто просмотреть все записиMap, чтобы выбрать наивысшее значение, сохранив текущее наивысшее значение в переменной:

public > V maxUsingIteration(Map map) < Map.EntrymaxEntry = null; for (Map.Entry entry : map.entrySet()) < if (maxEntry == null || entry.getValue() .compareTo(maxEntry.getValue()) >0) < maxEntry = entry; >> return maxEntry.getValue(); >

Здесь мы также используем универсальные шаблоны Java для создания метода, который можно применять к различным типам.

2.2. ИспользуяCollections.max()

Теперь давайте посмотрим, как служебный методmax() в классеCollections может избавить нас от написания многих из них самим:

public > V maxUsingCollectionsMax(Map map) < EntrymaxEntry = Collections.max(map.entrySet(), new Comparator() < public int compare(Entrye1, Entry e2) < return e1.getValue() .compareTo(e2.getValue()); >>); return maxEntry.getValue(); >

В этом примереwe’re passing a Comparator object to max(), который может использовать естественный порядок значенийEntry черезcompareTo() или вообще реализовать другой порядок.

3. После Java 8

Возможности Java 8 могут упростить нашу попытку получить максимальное значение изMapнесколькими способами, чем один.

3.1. ИспользованиеCollections.max() с лямбда-выражением

Начнем с изучения того, как лямбда-выражения могут упростить вызовCollections.max():

public > V maxUsingCollectionsMaxAndLambda(Map map) < EntrymaxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue() .compareTo(e2.getValue())); return maxEntry.getValue(); >

Как мы видим здесь,lambda expressions save us from defining the full-fledged functional interface — это краткий способ определения логики. Чтобы узнать больше о лямбда-выражениях, также посмотритеour previous article.

3.2. ИспользуяStream

APIStream — еще одно дополнение кJava 8, которое значительно упростило работу с коллекциями:

public > V maxUsingStreamAndLambda(Map map) < Optional maxEntry = map.entrySet() .stream() .max((Entry e1, Entry e2) -> e1.getValue() .compareTo(e2.getValue()) ); return maxEntry.get().getValue(); >

Этот API предлагает множество запросов на обработку данных, таких как преобразованияmap-reduce в коллекциях. Here, we’ve used max() over a stream of Map Entry, который является частным случаем операции сокращения. Более подробная информация об APIStream доступнаhere.

Мы также используем APIOptional, который представляет собой контейнерный объект, добавленный в Java 8, который может содержать или не содержать ненулевое значение. Более подробную информацию оOptional можно получитьhere.

3.3. ИспользованиеStream со ссылкой на метод

Наконец, давайте посмотрим, как ссылки на методы могут еще больше упростить использование лямбда-выражений:

public > V maxUsingStreamAndMethodReference(Map map) < Optional maxEntry = map.entrySet() .stream() .max(Comparator.comparing(Map.Entry::getValue)); return maxEntry.get() .getValue(); >

В случаях, когда лямбда-выражения просто вызывают существующий метод, ссылка на метод позволяет нам сделать это, используя имя метода напрямую. Для получения более подробной информации о method references посмотритеthis previous article.

4. Заключение

В этой статье мы рассмотрели несколько способов нахождения максимального значения вJava Map, некоторые из которых использовали функции, добавленные как часть Java 8.

Как всегда, доступен код для примеровover on GitHub.

Источник

Оцените статью