我研究流并用它们解决各种任务。我无法应对其中之一。我有一张标有城市和人口的地图。我只需要按人口降序显示城市名称。怎么写都写不出来
在以下示例中,应按以下顺序显示城市:布列斯特、维捷布斯克、明斯克、莫吉廖夫。
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());
到目前为止,我能够按人口排序,但我不明白如何显示进一步排序的城市名称。
不要先映射到值然后排序,而是先排序,然后您可以映射到名称或对城市流执行任何其他操作
您可以使用
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);
您可以使用
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())