Не выводит название города работая с Map Java
Исходные данные:
Map<String, Integer> cityCount = new HashMap<>();
cityCount.put("Omsk", 1300);
cityCount.put("Kiev", 5700);
cityCount.put("Marino", 2200);
cityCount.put("Moscow", 12400);
cityCount.put("Mexico", 20500);
key- города, value- численность людей в этих городах.
По тексту задачи нужно вывести город с самой большой численностью людей. В моем случае это Mexico со значением 20500. В моем коде отображаются цифры, но при выводе названия города выходит Null
Вот что написал:
Set<String> keys = cityCount.keySet();
int maxCity = 0;
for (String key : keys) {
if (cityCount.get(key) >= maxCity) {
maxCity = cityCount.get(key);
}
}
System.out.println("Большое количество население в городе: " + cityCount.get(keys));
И вот такой результат выдает мне:
Большое количество население в городе: null
Как можно вывести теперь сам город* Mexico?
Ответы (3 шт):
Оно и правильно. У вас нет ключа, который являет собой сет из названий городов. Т.к. keys у вас набор названий городов, то cityCount.get(keys) эквивалентно cityCount.get([Omsk, Mexico, Kiev, Marino, Moscow]). Понятно, что вернется null.
Сделайте еще одну переменную для города, и сохраняйте туда название, как только найден очередной максимум.
Предлагаю сделать таким способом
String maxCity = "";
int max = Integer.MIN_VALUE;
for (Map.Entry<String, Integer> city : cityCount.entrySet()) {
if(city.getValue() > max) {
max = city.getValue();
maxCity = city.getKey();
}
}
System.out.println("Большое количество население в городе: " + maxCity);
Можно использовать Stream API, в частности метод Stream::max(Comparator<? super T> comparator), где в качестве компаратора для элементов мапы можно использовать компаратор по значению Map.Entry.comparingByValue():
Map<String, Integer> cityCount = new HashMap<>();
cityCount.put("Omsk", 1300);
cityCount.put("Kiev", 5700);
cityCount.put("Marino", 2200);
cityCount.put("Moscow", 12400);
cityCount.put("Mexico", 20500);
System.out.println(cityCount.entrySet()
.stream()
.max(Map.Entry.comparingByValue()) // Optional<Map.Entry<String, Integer>>
.map(Map.Entry::getKey) // Optional<String>
.orElse("N/A")
);
// -> Mexico