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根据value排序
- Java实现对map或hashmap排序的三种方法或思路
- Java中使用TreeMap将Map的KeySet排序
- Map排序问题
- Map排序问题(有序或者无序)
- Map集合排序
- map排序;MD5加密
- List,map排序
- map排序方法
- 1075. PAT Judge (25)
- map按key和value排序
- 算法导论之随机算法
- Map按键排序(sort by key), 按值排序(sort by value)
- C++STL中,map/multimap,set/multiset 和vector的排序
- java进行文本单词的词频统计
- Java Map按Key值进行排序
- Java 进行词频统计,并按单词顺序顺序排序
- Java集合操作——Map排序
- 一些常用的js读写文件,排序等
- 前后端对请求参数排序