如何通过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));
关键修改说明:
- 调整操作顺序:先对
Map.Entry(键值对)排序,再提取城市名称,避免丢失关联信息。 - 排序逻辑:使用
Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder())明确指定按人口值降序排列。 - 结果输出:用
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,提问作者Денис Задорожний
相关产品推荐
相关产品推荐

