如何通过流显示按人口排序的城市名称?

问题描述 投票:0回答:2

我研究流并用它们解决各种任务。我无法应对其中之一。我有一张标有城市和人口的地图。我只需要按人口降序显示城市名称。怎么写都写不出来

在以下示例中,应按以下顺序显示城市:布列斯特、维捷布斯克、明斯克、莫吉廖夫。

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

List<Integer> collect =cities.entrySet().stream()
    .map(o->o.getValue())
    .sorted(Comparator.reverseOrder())
    .collect(Collectors.toList());

到目前为止,我能够按人口排序,但我不明白如何显示进一步排序的城市名称。

java java-stream
2个回答
2
投票

不要先映射到值然后排序,而是先排序,然后您可以映射到名称或对城市流执行任何其他操作

您可以使用

Map.Entry
 比较器按值对 
comparingByValue
进行排序:

var cityNames = cities.entrySet().stream()
    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
    .map(Map.Entry::getKey)
    .toList();
System.out.println(cityNames);

请注意,如果您创建一个记录/类来对城市建模,而不是使用

Map
,可能会更好。

record City(String name, int population) {}

在这种情况下,排序代码将变为:

List<City> cities = List.of(
    new City("Minsk",1999234),
    new City("Mogilev",1599234),
    new City("Vitebsk",3999231),
    new City("Brest",4999234)
);
var cityNames = cities.stream()
    .sorted(Comparator.comparingInt(City::population).reversed())
    .map(City::name)
    .toList();
System.out.println(cityNames);

1
投票

您可以使用

value
Map.Entry.comparingByValue()
排序,并反转以降序排列

cities.entrySet()
            .stream().sorted(Map.Entry.<String,Integer>comparingByValue().reversed())
            .forEach(System.out::println);

输出

Brest=4999234
Vitebsk=3999231
Minsk=1999234
Mogilev=1599234

如果你特别想打印

key
那么使用lambda来打印它

forEach(e-> System.out.println(e.getKey()))

使用

map
collect
将钥匙收集到
List

.map(Map.Entry::getKey)
.collect(Collectors.toList())
© www.soinside.com 2019 - 2024. All rights reserved.