面试题答案
一键面试- 实现自定义排序思路:
- 首先将
Map<String, Integer>
转换为List<Map.Entry<String, Integer>>
,因为List
可以方便地进行排序。 - 然后使用
Collections.sort
方法对这个List
进行排序,在排序时定义一个Comparator
来实现按照成绩从高到低,成绩相同按姓名字典序排序的逻辑。
- 首先将
- 可能会用到的
Map
接口相关类及方法:Map
接口:是键值对存储的基础接口。HashMap
类:实现了Map
接口,通常用于存储键值对数据,我们可以使用它来创建Map<String, Integer>
实例。Map.Entry
:它是Map
接口中的一个内部接口,表示Map
中的一个键值对。通过map.entrySet()
方法可以获取Set<Map.Entry<String, Integer>>
,再转换为List
进行排序。
- 大致实现代码:
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
并添加了学生姓名和成绩。 - 然后将
Map
的entrySet
转换为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));
}
}
在这段代码中:
- 使用流对
Map
的entrySet
进行排序,先按成绩从高到低排序,成绩相同则按姓名字典序排序。 - 使用
Collectors.toMap
方法将排序后的结果收集到一个新的Map
中,这里使用LinkedHashMap
来保持排序后的顺序。 - 最后遍历输出排序后的
Map
。