You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java Streams按人口降序排序并输出城市名称?

解决Java Streams按人口降序获取城市名称的问题

你的核心问题是过早提取了人口值,丢失了城市名称与人口的关联。原代码第一步就用map(o->o.getValue())只保留了人口数,后续操作自然拿不到对应的城市名称。以下是修改后的完整实现:

Map<String, Integer> cities = new HashMap<>();
cities.put("Minsk", 1999234);
cities.put("Mogilev", 1599234);
cities.put("Vitebsk", 3999231);
cities.put("Brest", 4999234);

// 修改后的代码:按人口降序提取城市名称
List<String> sortedCities = cities.entrySet().stream()
    // 先按人口值降序排序,保留键值对的关联
    .sorted(Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder()))
    // 提取排序后的城市名称
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

// 输出预期格式的结果
System.out.println(String.join(", ", sortedCities));

关键修改说明:

  1. 调整操作顺序:先对Map.Entry(键值对)排序,再提取城市名称,避免丢失关联信息。
  2. 排序逻辑:使用Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder())明确指定按人口值降序排列。
  3. 结果输出:用String.join直接将列表拼接为预期的逗号分隔格式。

如果不需要保存列表,想直接输出结果,也可以简化为:

cities.entrySet().stream()
    .sorted(Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder()))
    .map(Map.Entry::getKey)
    .forEachOrdered(city -> System.out.print(city + ", "));

这里用forEachOrdered而非forEach,是为了确保在并行流场景下仍能严格按排序后的顺序输出。

内容的提问来源于stack exchange,提问作者Денис Задорожний

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:45:36