前言:之前每次需要对HashMap的key进行排序,往往是将value全部取出存入一个数组,先进行一次对value的排序;然后再进行从map中按照排序好的value取出key。若还需要对value相同的key进行排序,就需要一个中间list存入value相同的key,按照key的“其他规则”排好之后,再向最终的结果数组中存。这种方法需要写大量的代码,工作量较大。于是,尝试通过比较器来实现对Map的key进行排序的方法。
本博文程序使用的方法:
- 定义比较器,实现Comparator接口(为了map元素的可见性,此处定义为了内部类);
- 将map对象的key全部取出,存入一个数组中。String[] keyArr = map.keySet().toArray(new String[map.size()]);
- 使用Arrays中的sort方法对key值对应的数组进行排序(使用步骤1中定义的比较器)。Arrays.sort(keyArr, new ComparatorMap().new ComparMap()); 此处,为内部类的调用。
import java.util.*;
public class ComparatorMap {
static Map<String, Integer> map = new HashMap<>();
static {
map.put("a", 3);
map.put("b", 3);
map.put("c", 8);
map.put("d", 2);
map.put("f", 2);
map.put("g", 2);
map.put("e", 2);
}
public static String[] sortMapKey(Map<String, Integer> map) {
// 提取map的key
String[] keyArr = map.keySet().toArray(new String[map.size()]);
// 根据自定义的比较器进行排序
Arrays.sort(keyArr, new ComparatorMap().new ComparMap());
return keyArr;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(sortMapKey(map)));
}
/**
* 定义一个内部类(为了能够访问map数据),用作比较器
*/
class ComparMap implements Comparator<String> {
// 覆写比价方法
@Override
public int compare(String o1, String o2) {
if(map.get(o1)>map.get(o2)) { // 首先按照key对应的value值进行比较;
return 1;
}else if(map.get(o1)<map.get(o2)) {
return -1;
}else {
return o1.compareTo(o2); // 如果key的value相同,按照key的字典序排序
}
}
}
}