一:起因:

(1)现实中须要Map容器进行排序的情况非常多非常多:由于Map<key,value>键值对的存储结构特别是HashMap的结构是非常优秀的,数据存储就难免对其进行排序;

(2)数据处理,仅仅要用到映射关系的,离不开Map,这在数据处理中是很有用的,而排序是对数据的进一步处理;

(3)Map排序的方式有非常多种,两种比較经常使用的方式:按键排序(sort by key), 按值排序(sort by value)

二:排序的算法

(1)按键排序

jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法 TreeMap(Comparator<? super K> comparator)  传入我们自己定义的比較器就可以实现按键排序。

// 主类
public class MapSortDemo {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>();
map.put("KFC", "kfc");
map.put("WNBA", "wnba");
map.put("NBA", "nba");
map.put("CBA", "cba");
Map<String, String> resultMap = sortMapByKey(map); //按Key进行排序
for (Map.Entry<String, String> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
} /**
* 使用 Map按key进行排序
* @param map
* @return
*/
public static Map<String, String> sortMapByKey(Map<String, String> map) {
if (map == null || map.isEmpty()) {
return null;
}
Map<String, String> sortMap = new TreeMap<String, String>(new MapKeyComparator());
sortMap.putAll(map);
return sortMap;
}
} //比較器类
public class MapKeyComparator implements Comparator<String>{
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}

说明一:比較器类,MapKeyComparator implements Comparator<String> 中的參数是通过类似模板类的Comparator<>传进来的,再重载其compare()函数就可以,比較简单。

说明二:主类中的 sortMapByKey(Map<String, String> map) 函数中声明TreeMap<String,String>(new MapKeyComparator())进行key值排序,再调用sortMap.putAll(map) 拷贝到新的map中。

说明三:数据是用TreeMap存储的。

(2)按值排序

按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,须要我们自己转换一下。

Map本身按值排序是非常有意义的,非常多场合下都会遇到类似需求,能够觉得其值是定义的某种规则或者权重。

原理:将待排序Map中的全部元素置于一个列表中,接着使用Collections的一个静态方法 sort(List<T> list, Comparator<? super T> c) 

来排序列表,相同是用比較器定义比較规则。排序后的列表中的元素再依次装入Map,为了肯定的保证Map中元素与排序后的List中的元素的顺序一致,使用

LinkedHashMap数据类型

实现代码

// 主类
public class MapSortDemo {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>();
map.put("KFC", "kfc");
map.put("WNBA", "wnba");
map.put("NBA", "nba");
map.put("CBA", "cba");
Map<String, String> resultMap = sortMapByValue(map); //按Value进行排序
for (Map.Entry<String, String> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
} /**
* 使用 Map按value进行排序
* @param map
* @return
*/
public static Map<String, String> sortMapByValue(Map<String, String> map) {
if (map == null || map.isEmpty()) {
return null;
}
Map<String, String> sortedMap = new LinkedHashMap<String, String>();
List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(map.entrySet());
Collections.sort(entryList, new MapValueComparator());
Iterator<Map.Entry<String, String>> iter = entryList.iterator();
Map.Entry<String, String> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
return sortedMap;
}
} //比較器类
public class MapValueComparator implements Comparator<Map.Entry<String, String>> {
public int compare(Entry<String, String> me1, Entry<String, String> me2) {
return me1.getValue().compareTo(me2.getValue());
}
}

说明一:比較器类,MapValueComparator implements Comparator<Map.Entry<String,String>> 中的參数是通过类似模板类的Comparator<>传进来的,再重载其compare()函数就可以,仅仅是參数是Map.Entry<String,String>的接口类,compare()函数的两个參数也对应的变为Entry<String,String>。

说明二:主类中的 sortMapByKey(Map<String, String> map) 函数中声明LinkedHashMap<String,String>再用ArrayList<Map.Entry<String,String>>(map.entrySet())进行List形式的存储,再调用collections.sort(entryList,

new MapKeyComparator())进行排序;最后把entryList转化为LinkedMap

说明三:数据是用TreeMap存储的。



java Map 之 排序(key,value)的更多相关文章

  1. Java Map集合按照key和value排序之法

    一.理论基点 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black-Tre ...

  2. 160725、Java Map按键排序和按值排序

    按键排序(sort by key) jdk内置的Java.util包下的TreeMap<K,V>既可满足此类需求,原理很简单,其重载的构造器之一 有一个参数,该参数接受一个比较器,比较器定 ...

  3. Java Map 怎样实现Key 的唯一性?

    大家都知道.在Map和Set不可存在反复元素? 可是对于内部的细节我们并不了解.今天我们就一块来 探讨一下! 1 对于 HashMap  HashSet 他们的底层数据结构的实现是:维护了一张  Ha ...

  4. java map典型排序

    List<Map.Entry<TbDiseases, Double>> list = new ArrayList<Map.Entry<TbDiseases,Doub ...

  5. java map遍历、排序,根据value获取key

    Map 四种遍历: Map<String,String> map = new HashMap<String, String>(); map.put("one" ...

  6. 【Java进阶】---map集合排序

    map集合排序         这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题.   比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...

  7. Java map 详解 - 用法、遍历、排序、常用API等

    尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...

  8. Java提高(5)---map集合排序

    map集合排序 这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题. 比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按照成绩的好坏进行排序 ...

  9. Java语言利用Collections.sort对Map,List排序

    1.main方法包含TreeMap排序1,TreeMap排序2,HashMap排序,List<Integer>排序,List<Bean>排序,List<Map>排序 ...

随机推荐

  1. C++primer读书笔记9-转换和类类型

    有时指定自己的类类型来表示某些类型的数据,如SmallInt,然后在为了便于计算将指定一个转换算,类类型,在某些情况下,自己主动转换为指定的类型 <1>转换操作符 operator typ ...

  2. 抓取csdn上的各类别的文章 (制作csdn app 二)

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23532797 这篇博客接着上一篇(Android 使用Fragment,View ...

  3. CAS实现SSO单点登录原理(转)

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  4. 高榕资本宾悦:未使用的企业家Testin云测试服务类故障

    高榕资本岳斌:创业者未使用Testin云測试服务属不合格 2014/10/09 · Testin · 开发人员訪谈 Testin云測与工信部等联合承办的ICT中国.2014高层论坛之移动开发人员分论坛 ...

  5. ubuntu 在下面 hadoop 安装

    这两天已经安装hadoop 这些道路是曲折的,记录它 在redhat安装后一直无法开始datanode,因为jdk 问题,换了一个jdk后问题依然,自己猜測是redhat版本号太低的原因,于是仅仅好舍 ...

  6. UVa 11587 - Brick Game

    称号:背景:brick game有N块,给你一个整数的定数S,两个人轮流木: 的木块数是集合S中存在的随意数字.取走最后木块的人获胜.无法取则对方获胜. 题干:如今让你先取,给你一个你的结果序列串T, ...

  7. Android属于查询执行情况的电话号码

    这部分是昨天学习,但是因为眼所以现在到眼睛超负荷,以后要合理规划时间. 现在里面的手机号码归属地查询主要通过两种途径:1.网络查询.2.匹配本地归属地数据库. 我认为最好的两个方法的结合,在进行联网查 ...

  8. hdu3037Saving Beans

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  9. MemberwishClone学习

    /* * Created by SharpDevelop. * User: My little flower basket * Date: 2013/7/12 * Time: 9:37 * * To ...

  10. QR代码简单

    QR代码(Quick Response Code, 高速响应码)属于二维矩阵码在一个.由DENSO(日本电装)公司开发,由JIS和ISO将其标准化. QR码分为两种模式:模式1.模式2.当中.模式1相 ...