您的位置:首页 > 产品设计 > UI/UE

Java Map排序——按key和按value

2015-12-14 00:33 459 查看
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
221 kt
101 yu
21 th
可见结果按key降序排序了。

二、按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
歌曲:3
图书:4
动漫:4
图标:6
音像:6
影视:7
音乐:8
素材:9
上面代码是针对元素是<String,Integer>的Map,不适用于<String,String>或<String,Long>等情况。怎么办?再写几个针对不同类型的方法?那样太费劲了,并且代码冗余,不利于维护。有其他好的解决方法吗?有的,泛型。
泛型让编程人员能够使用类型抽象,也就是说编程的时候不用管数据具体的类型是什么。
代码:
/**
* 按照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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Map排序