Java 8 |Поиск записи карты с наибольшим размером значения - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть модель Person [город, имя].Я собрал их в карту и сгруппировал их по городам.Мне нужно отследить город, в котором больше всего нет людей, и вернуть только эту запись как часть карты.Я пытался, и это тоже работает, но мне было интересно, есть ли лучший способ сделать.

Comparator<Entry<String, List<Person>>> compareByCityPopulation =
        Comparator.comparing(Entry<String, List<Person>>::getValue, (s1, s2) -> {
            return s1.size() - s2.size();
        });

HashMap mapOfMostPopulatedCity = persons.stream()
        .collect(Collectors.collectingAndThen(Collectors.groupingBy(Person::getCity), m -> {

            Entry<String, List<Person>> found = m.entrySet().stream().max(compareByCityPopulation).get();

            HashMap<String, List<Person>> hMap = new HashMap<>();
            hMap.put(found.getKey(), found.getValue());

            return hMap;
        }));

System.out.println("*City with Most no of people*");
mapOfMostPopulatedCity.forEach((place, peopleDetail) -> System.out.println("Places " + place + "-people detail-" + peopleDetail));

Подскажите, пожалуйста, как мы можем писать лучше в java 8.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

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

Map<String, List<Person>> mapOfMostPopulatedCity = persons.stream()
    .collect(Collectors.groupingBy(Person::getCity)).entrySet().stream()
    .max(Comparator.comparingInt(e -> e.getValue().size()))
    .map(e -> Collections.singletonMap(e.getKey(), e.getValue()))
    .orElseThrow(IllegalArgumentException::new);

С Java9 вы можете использовать Map.of(e.getKey(), e.getValue()) для построения карты с одной записью.

0 голосов
/ 21 февраля 2019

Предположим, что если у вас есть список лиц

List<Person> persons = new ArrayList<Person>();

Тогда первая группа По ним, основанная на городе, а затем получить запись с максимальными значениями в списке max вернет Optional из Entryтак что я не усложню, я просто использую HashMap для сохранения результата, если он присутствует в необязательном порядке, иначе вернётся пустое Map

Map<String, List<Person>> resultMap = new HashMap<>();

     persons.stream()
    .collect(Collectors.groupingBy(Person::getCity)) //group by city gives Map<String,List<Person>>
    .entrySet()
    .stream()
    .max(Comparator.comparingInt(value->value.getValue().size())) // return the Optional<Entry<String, List<Person>>>
    .ifPresent(entry->resultMap.put(entry.getKey(),entry.getValue()));

//finally return resultMap
...