在力扣刷题的过程中,一些题目常常需要使用Map来进行存储,经过一系列的处理以后还需要对map中的数据进行排序,便于输出结果。
本笔记主要是记录如何对map进行排序。
以0904华为笔试的第一题为例,最后的map是Map<Integer,Integer> 形式存在的,排序要求是首先对用value从大到小进行排序,当value相同时,使用key从大到小进行排序。最后输出排序后的key值集合。
首先将map转换为Map.Entry的集合
List<Map.Entry<Integer, Integer>> entries = new ArrayList<>(map.entrySet());
然后对集合entries进行排序,方法一使用匿名内部类进行排序
entries.sort(new Comparator<Map.Entry<Integer,Integer>>() {
@Override
public int compare(Map.Entry<Integer,Integer>>() entry1, Map.Entry<Integer,Integer>>() entry2){
int valueCom = Integer.compare(entry2.getValue(), entry1.getValue());
if(valueCom !=0) return valueCom;
return Integer.compare(entry2.getKey(), entry1.getKey());
}
}
)
方法二通过Lambda简化代码
entries.sort((entry1, entry2) -> {
int valueComparison = Integer.compare(entry2.getValue(), entry1.getValue());
if (valueComparison != 0) {
return valueComparison;
}
return Integer.compare(entry2.getKey(), entry1.getKey());
})
最后按要求整理结果
List<Integer> sortedKeys = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : entries) {
sortedKeys.add(entry.getKey());
}
return sortedKeys;