MST

星途 面试题库

面试题:Java Map接口使用技巧之自定义排序

在Java中,有一个`Map<String, Integer>`,其中`String`是学生姓名,`Integer`是学生成绩。现在要求按照成绩从高到低对这个`Map`进行排序,如果成绩相同则按姓名的字典序排序。请描述如何实现这种自定义排序,并且说明可能会用到的`Map`接口相关类及方法,并给出大致实现代码。
26.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 实现自定义排序思路
    • 首先将Map<String, Integer>转换为List<Map.Entry<String, Integer>>,因为List可以方便地进行排序。
    • 然后使用Collections.sort方法对这个List进行排序,在排序时定义一个Comparator来实现按照成绩从高到低,成绩相同按姓名字典序排序的逻辑。
  2. 可能会用到的Map接口相关类及方法
    • Map接口:是键值对存储的基础接口。
    • HashMap类:实现了Map接口,通常用于存储键值对数据,我们可以使用它来创建Map<String, Integer>实例。
    • Map.Entry:它是Map接口中的一个内部接口,表示Map中的一个键值对。通过map.entrySet()方法可以获取Set<Map.Entry<String, Integer>>,再转换为List进行排序。
  3. 大致实现代码
import java.util.*;

public class MapSortingExample {
    public static void main(String[] args) {
        Map<String, Integer> studentScores = new HashMap<>();
        studentScores.put("Alice", 85);
        studentScores.put("Bob", 90);
        studentScores.put("Charlie", 85);

        List<Map.Entry<String, Integer>> list = new ArrayList<>(studentScores.entrySet());

        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                int scoreComparison = o2.getValue().compareTo(o1.getValue());
                if (scoreComparison == 0) {
                    return o1.getKey().compareTo(o2.getKey());
                }
                return scoreComparison;
            }
        });

        for (Map.Entry<String, Integer> entry : list) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

在上述代码中:

  • 首先创建了一个HashMap并添加了学生姓名和成绩。
  • 然后将MapentrySet转换为List
  • 使用Collections.sort方法对List进行排序,在Comparator中实现了自定义的排序逻辑。
  • 最后遍历排序后的List输出结果。

还可以使用Java 8的流(Stream)来实现同样的功能,代码如下:

import java.util.*;
import java.util.stream.Collectors;

public class MapSortingExampleWithStream {
    public static void main(String[] args) {
        Map<String, Integer> studentScores = new HashMap<>();
        studentScores.put("Alice", 85);
        studentScores.put("Bob", 90);
        studentScores.put("Charlie", 85);

        Map<String, Integer> sortedMap = studentScores.entrySet().stream()
              .sorted(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder())
                     .thenComparing(Map.Entry.comparingByKey()))
              .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (e1, e2) -> e1, LinkedHashMap::new));

        sortedMap.forEach((k, v) -> System.out.println(k + ": " + v));
    }
}

在这段代码中:

  • 使用流对MapentrySet进行排序,先按成绩从高到低排序,成绩相同则按姓名字典序排序。
  • 使用Collectors.toMap方法将排序后的结果收集到一个新的Map中,这里使用LinkedHashMap来保持排序后的顺序。
  • 最后遍历输出排序后的Map