为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 | 查找具有最大值大小的地图条目

Java 8 | 查找具有最大值大小的地图条目

繁星点点滴滴 2022-06-30 11:15:52
我有模型人 [城市,名称]。我已在地图中收集它们并按城市对它们进行分组。我需要追踪最没有人住在那里的城市,并只返回该条目作为地图的一部分。我试过了,它也可以工作,但我想知道有没有更好的方法。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 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

获得最大地图条目后,您必须将其转换为具有单个条目的地图。为此,您可以使用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())单个条目来构建地图。


查看完整回答
反对 回复 2022-06-30
?
holdtom

TA贡献1805条经验 获得超10个赞

假设如果你有一个人员列表


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


查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信