Получение минимального значения из хэш-карты, которая хранит объект как значение - PullRequest
1 голос
/ 07 ноября 2019

Я хочу получить минимальное значение из данных в HashMap для определенного значения в объекте и, если возможно, без выполнения цикла for и т. Д. Чтобы получить это, у меня есть следующее:

HashMap<String, Country> biggestCountries = new HashMap<String, Country>();

В качестве хэш-карты. Данные, которые я хочу сравнить, хранятся в стране объекта и могут быть получены с помощью:

country.getArea();

До сих пор я пытался получить это минимальное значение, но оно заработало только после замены объекта Странас целым числом:

Collections.min(biggestCountries.entrySet(), Map.Entry.comparingByValue()).getKey();

Может кто-нибудь знает хороший способ заставить это работать?

Ответы [ 4 ]

3 голосов
/ 07 ноября 2019

Вы можете попробовать что-то вроде этого, используя значения и поток:

Country country = biggestCountries.values()
                  .stream()
                  .sorted(Comparator.comparing(c -> c.getArea()))
                  .findFirst()
                  .orElse(null);

Это позволит отсортировать значения по возрастанию их области и вернуть первое найденное значение или ноль, если ничего нет.

И как другие предложили:

Country country = biggestCountries.values()
                  .stream()
                  .min(Comparator.comparing(c -> c.getArea()))
                  .orElse(null);

, который вернет найденное минимальное значение или ноль.

3 голосов
/ 07 ноября 2019

Вы можете создать Comparator, который сортирует на основе area и получить Entry из Map

Comparator<Map.Entry<String, Country>> comp = 
         Comparator.comparing((Entry<String, Country> entry)->entry.getValue().getArea());

Используя Collections.min

Collections.min(biggestCountries.entrySet(),comp);

Использование stream

Entry<String, Country> entry = biggestCountries.entrySet()
                                               .stream()
                                               .min(comp)
                                               .orElse(null);

Если вы хотите получить только Country, используйте stream

Country minCountry = biggestCountries.values()
                        .stream()
                        .min(Comparator.comparing(Country::getArea))
                        .orElse(null);

или используя Collections.min

Country minCountry = Collections.min(biggestCountries.values(),
                           Comparator.comparing(Country::getArea));
1 голос
/ 07 ноября 2019

Это полный код для получения страны с минимальной площадью.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionMinExample {

    public static void main(String args[]){

        List<Country> countries = new ArrayList<>();
        countries.add(new Country("IN", 25000));
        countries.add(new Country("US", 45000));
        countries.add(new Country("SL", 14000));
        countries.add(new Country("CH", 24000));
        Country minAreaCountry = Collections.min(countries, (c1, c2) -> c1.getArea().compareTo(c2.getArea()));
        System.out.println("Country with minimum Area: "+minAreaCountry.getName());
    }
}

class Country{

    private String name;
    private Integer area;

    public Country(String name, Integer area){
        this.name = name;
        this.area = area;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getArea() {
        return area;
    }
    public void setArea(Integer salary) {
        this.area = salary;
    }
}
0 голосов
/ 07 ноября 2019

Другое решение:

    Country minAreaCountry = biggestCountries.values().stream()
        .min(Comparator.comparing(Country::getArea))
        .orElse(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...