Map排序——按key排序,按value排序
注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5959279.html
上一篇博文谈到了集合类的自定义排序方式,那么进一步扩展开来,与集合同等重要的Map有没有类似的自定义排序方法呢?当然是有的,主要分两种,按键排序、按值排序。
而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用。
一、按键排序
按Key排序主要用于TreeMap,可以实现按照Key值的大小,在对象插入时直接插入到合适的位置,保持Map的顺序性。
来看TreeMap的构造函数: TreeMap(Comparator<? super K> comparator):
构造一个新的、空的树映射,该映射根据给定比较器进行排序。
这里的比较器是key的比较器。所以定义比较器时用于比较的两个参数是Key的数据类型的对象。
测试代码:
- public class MapSortTest {
- public static void main(String[] args) {
- Map<String,String> stu=new TreeMap<>(new MyComparator());//传进来一个key的比较器对象来构造treemap
- stu.put("apple", "55");
- stu.put("boy", "32");
- stu.put("cat", "22");
- stu.put("dog", "12");
- stu.put("egg", "11");
- //map的遍历:把key抽取出来用set存放,然后用迭代器遍历keyset,同时用map.get(KEY)获取key所对应的value。
- Set<String> keySet=stu.keySet();
- Iterator it=keySet.iterator();
- while (it.hasNext()) {
- String next = (String)it.next();
- System.out.println(next+","+stu.get(next));
- }
- }
- }
- //定义key的比较器,比较算法根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数,来决定二者存放的先后位置:返回负数则o1在前,正数则o2在前。
- class MyComparator implements Comparator<String>{
- public int compare(String o1, String o2) {
- return o1.compareTo(o2);
- }
- }
二、按值排序
与按值排序只使用TreeMap不同,按值排序由于其方法所用到的类型的统一性,所以能用于Map的所有子类。
主要用到的知识点有;
1:map.entrySet()将map里的每一个键值对取出来封装成一个Entry对象并存放到一个Set里面。
2:泛型Map.Entry<type1,type2> 因为Key-value对组成Entry对象,此处指明Entry对象中这两个成员的数据类型。
3:Collections.sort(List<T> list, Comparator<? super T> c) 集合类的排序方法,通过自定义的比较器进行排序。这里的list存放的对象是entry对象。定义比较器对entry对象中的value属性进行比较。
测试代码如下:
- public class MapSortTest {
- public static void main(String[] args) {
- Map<String,String> stu=new TreeMap<>();//用TreeMap储存
- // Map<String,String> stu=new HashMap<>();//用HashMap储存
- stu.put("apple", "55");
- stu.put("boy", "32");
- stu.put("cat", "22");
- stu.put("dog", "12");
- stu.put("egg", "11");
- //1:把map转换成entryset,再转换成保存Entry对象的list。
- List<Map.Entry<String,String>> entrys=new ArrayList<>(stu.entrySet());
- //2:调用Collections.sort(list,comparator)方法把Entry-list排序
- Collections.sort(entrys, new MyComparator());
- //3:遍历排好序的Entry-list,可得到按顺序输出的结果
- for(Map.Entry<String,String> entry:entrys){
- System.out.println(entry.getKey()+","+entry.getValue());
- }
- }
- }
- //自定义Entry对象的比较器。每个Entry对象可通过getKey()、getValue()获得Key或Value用于比较。换言之:我们也可以通过Entry对象实现按Key排序。
- class MyComparator implements Comparator<Map.Entry>{
- public int compare(Map.Entry o1, Map.Entry o2) {
- return ((String)o1.getValue()).compareTo((String)o2.getValue());
- }
- }
注意:用Entry对象来排序只是在提取出来的entry-list中实现了位置变换而达到有序,而map本身的储存顺序是没有变化的!这里的有序是只不过是储存着和map相同数据的list的有序罢了。所以遍历排序后结果的时候是遍历list而不是map。
Map排序——按key排序,按value排序的更多相关文章
- Android 对Map按key和value分别排序
一.理论准备 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black tre ...
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- 对Map按key和value分别排序
一.理论准备 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红 ...
- java Map 之 排序(key,value)
一:起因: (1)现实中须要Map容器进行排序的情况非常多非常多:由于Map<key,value>键值对的存储结构特别是HashMap的结构是非常优秀的,数据存储就难免对其进行排序: (2 ...
- Java Map 键值对排序 按key排序和按Value排序
一.理论准备 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black tre ...
- Map集合利用比较器Comparator根据Key和Value的排序
TreeMap排序 根据Key进行排序 Map的根据key排序需要用到TreeMap对象,因为它是默认按照升序进行输出的,可以使用比较器compareTo对它进行降序排序,Comparator可以对集 ...
- 【Java】对Map按key和value分别排序
一.什么是Map? 在讲解Map排序之前,我们先来稍微了解下map. map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. ...
- C++ STL中Map的按Key排序跟按Value排序
C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定 ...
- 对Map的key按升序进行排序
//对Map的key按升序进行排序 List<Map.Entry<Integer,Task>> mappingList = new ArrayList<Map.Entry ...
随机推荐
- linux 命令行字符终端terminal下强制清空回收站
回收站其实就是一个文件夹,存放被删掉的文件. ubuntu 回收站的路径: $HOME/.local/share/Trash/ 强制清空回收站: rm -fr $HOME/.local/share/T ...
- Linux编程(获取系统时间)
#include <stdio.h> #include <time.h> int main() { time_t now; struct tm *w; time(&no ...
- nodejs开发阶段利器supervisor
在开始学习nodejs时,往往一般写代码,一边看效果.先停止node,再重新运行.非常耗时. 这时supervisor派上了用场. 安装 推荐使用npm,本人一直使用局部安装,这样可以将全部文件安装在 ...
- SAS Config文件 处理流程
Processing Options Specified by Additional CONFIG Options You can also specify additional –CONFIG op ...
- mysql 概念和逻辑架构
1.MySQL整体逻辑架构 mysql 数据库的逻辑架构如下图: 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安 ...
- 用 Javascript 获取页面大小、窗口大小和滚动条位置
页面大小.窗口大小和滚动条位置这三个数值在不同的浏览器例如 Firefox 和 IE 中有着不同的实现.即使在同一种浏览器例如 IE 中,不同版本也有不同的实现. 本文给出两个能兼容目前所有浏览器的 ...
- linux 下安装flash player
或者直接下载:i386系统wget http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-1.0-1.noarch.rpmrp ...
- SmartGit STUDY
Git Concepts This section helps you to get started with Git and gives you an understanding of the fu ...
- poj 2185(二维kmp)
题意:让你求一个最小的覆盖子矩阵. 分析:首先第一点是确定的:那就是这个子矩阵肯定位于左上角,然后按行考虑,求出每一行可能的重复子串的长度,然后取所有行都存在并且长度最短的长度最为最小子矩阵的宽, 最 ...
- 对JAVA集合进行遍历删除时务必要用迭代器
java集合遍历删除的方法: 1.当然这种情况也是容易解决,实现方式就是讲遍历与移除操作分离,即在遍历的过程中,将需要移除的数据存放在另外一个集合当中,遍历结束之后,统一移除. 2.使用Iterato ...