Map的排序分为按key排序和按value排序。这里讲讲这两种方法。
一、按key排序
借助TreeMap来按key排序。TreeMap默认按key进行升序排序。如果想改变默认的顺序,定义一个Comparator即可。 代码:public static void main(String[] args) {输出结果:
Map<Integer, String> map = new TreeMap<Integer, String>(
new Comparator<Integer>() {
@Override
public int compare(Integer str1, Integer str2) {
return str2.compareTo(str1);
}
});
map.put(101, "yu");
map.put(21, "th");
map.put(221, "kt");
map.put(1622, "gj");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
1622 gj可见结果按key降序排序了。
221 kt
101 yu
21 th
二、按value排序
TreeMap主要是针对key进行默认排序的,并没有针对value的排序。但是有时候我们需要对value进行排序,所以采取的策略是将map变为List,然后利用Collections.sort进行排序,同时重写Comparator方法。
例子:/**
* 按照value对Map排序
* @param map
* @param isAsc 是否升序排序
* @return ArrayList 有序存储着Map的元素
*/
public static ArrayList<Map.Entry<String, Integer>> sortMapByValue2(Map<String, Integer> map,
final boolean isAsc) {
//把Map转换为List
List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(
map.entrySet());
//利用Collections.sort进行排序
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> obj1,
Map.Entry<String, Integer> obj2) {
if(isAsc)
return obj1.getValue().compareTo(obj2.getValue());
else
return obj2.getValue().compareTo(obj1.getValue());
}
});
return (ArrayList<Entry<String, Integer>>) entries;
}
测试代码:
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("图书", 4);
map.put("音像", 6);
map.put("素材", 9);
map.put("音乐", 8);
map.put("影视", 7);
map.put("动漫", 4);
map.put("歌曲", 3);
map.put("图片", 2);
map.put("图标", 6);
ArrayList<Map.Entry<String, Integer>> entries = sortMapByValue0(map,true);
for (Map.Entry<String, Integer> entry:entries) {
System.out.println(entry.getKey() + ":"+ entry.getValue());
}
}
运行结果:
图片:2上面代码是针对元素是<String,Integer>的Map,不适用于<String,String>或<String,Long>等情况。怎么办?再写几个针对不同类型的方法?那样太费劲了,并且代码冗余,不利于维护。有其他好的解决方法吗?有的,泛型。 泛型让编程人员能够使用类型抽象,也就是说编程的时候不用管数据具体的类型是什么。 代码:
歌曲:3
图书:4
动漫:4
图标:6
音像:6
影视:7
音乐:8
素材:9
/**测试代码:
* 按照value对Map排序
* @param map
* @param isAsc 是否升序排序
* @return ArrayList 有序存储着Map的元素
*/
public static<K, V extends Comparable<V>> ArrayList<Map.Entry<K, V>>
sortMapByValue(Map<K, V> map,final boolean isAsc) {
//把Map转换为List
List<Map.Entry<K, V>> entries = new ArrayList<Map.Entry<K, V>>(
map.entrySet());
//利用Collections.sort进行排序
Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {
public int compare(Map.Entry<K, V> obj1,
Map.Entry<K, V> obj2) {
if(isAsc)
return obj1.getValue().compareTo(obj2.getValue());
else
return obj2.getValue().compareTo(obj1.getValue());
}
});
return (ArrayList<Entry<K, V>>) entries;
}
public static void main(String[] args) {运行结果:
//测试代码1
System.out.println("测试代码1:");
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("图书", 4);
map.put("音像", 6);
map.put("素材", 9);
map.put("音乐", 8);
map.put("影视", 7);
map.put("动漫", 4);
map.put("歌曲", 3);
map.put("图片", 2);
map.put("图标", 6);
ArrayList<Map.Entry<String, Integer>> entries = sortMapByValue(map,true);
for (Map.Entry<String, Integer> entry:entries) {
System.out.println(entry.getKey() + ":"+ entry.getValue());
}
//测试代码2
System.out.println("\n测试代码2:");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("图书", "s");
map2.put("音像", "f");
map2.put("素材", "c");
map2.put("音乐", "e");
map2.put("影视", "d");
ArrayList<Map.Entry<String, String>> entries2 = sortMapByValue(map2, true);
for (Map.Entry<String, String> entry : entries2) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
测试代码1:
图片:2
歌曲:3
图书:4
动漫:4
图标:6
音像:6
影视:7
音乐:8
素材:9
测试代码2:
素材:c
影视:d
音乐:e
音像:f
图书:s