浅谈Java之Map按值排序(Mapsortbyvalue)
在Java中,Map是一种非常常用的数据结构,它存储的是键值对,由于Map不是一个序列,所以它的排序需要进行特殊处理。本文将详细探讨如何对Map按值进行排序。
思路
对于Map的排序,我们需要先将Map的键值对转换成List,然后对List进行排序。对于List的排序,我们需要自定义一个比较器,通过比较器来实现按值进行排序。
代码实现
public class MapSortByValue {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Tom", 80);
map.put("Jerry", 70);
map.put("Mike", 90);
map.put("Mary", 75);
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
for (Map.Entry<String, Integer> entry : list) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
上述代码中,我们首先通过map.entrySet()
将Map转换成List,并用ArrayList
存储。然后对List进行排序,通过重写比较器中的compare()
方法,实现按值进行排序。最后遍历排好序的List,输出键值对即可。
运行结果为:
Jerry 70
Mary 75
Tom 80
Mike 90
示例说明
接下来,我们通过两个示例来说明如何对Map按值排序。
示例1:按照成绩单中学生的平均分进行排序
假设成绩单的数据结构如下:
Map<String, List<Integer>> scoreMap = new HashMap<>();
其中,键表示学生的姓名,值为一个列表,存储学生的多次考试成绩。我们需要计算每个学生的平均分,并按照平均分进行排序。
public static void sortByAvgScore(Map<String, List<Integer>> scoreMap) {
List<Map.Entry<String, Double>> list = new ArrayList<>();
for (Map.Entry<String, List<Integer>> entry : scoreMap.entrySet()) {
double avgScore = entry.getValue().stream().mapToInt(Integer::intValue).average().orElse(0);
list.add(new AbstractMap.SimpleEntry<>(entry.getKey(), avgScore));
}
Collections.sort(list, new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
for (Map.Entry<String, Double> entry : list) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
上述代码中,我们先遍历成绩单的Map,用stream()
方法和mapToInt()
方法将一个列表转换成一个IntStream,并通过average()
方法计算平均分。然后将键值对转换成AbstractMap.SimpleEntry
对象,用ArrayList
存储。最后对List进行排序,并遍历输出即可。
示例2:按照商品销售额进行排序
假设有一个在线商城,有如下的销售产品和销售数量的数据结构:
Map<String, Integer> salesMap = new HashMap<>();
我们需要按照商品销售额进行排序,并输出最畅销的前几个商品。
public static void sortBySales(Map<String, Integer> salesMap, int topN) {
List<Map.Entry<String, Integer>> list = new ArrayList<>(salesMap.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
int i = 0;
for (Map.Entry<String, Integer> entry : list) {
System.out.println(entry.getKey() + " " + entry.getValue());
i++;
if (i == topN) {
break;
}
}
}
上述代码中,我们先将Map转换成List,并用ArrayList
存储。然后对List进行排序,用Collections.sort()
方法并重写比较器中的compare()
方法,实现按值进行排序。最后遍历输出排好序的List,并限制循环次数即可。
结论
对于Map按值排序,我们只需要将Map转换成List,然后对List进行排序。但是,排序需要自定义比较器,并重写比较器的compare()
方法,实现按值进行排序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java之Map 按值排序 (Map sort by value) - Python技术站