Java Map集合按照key和value排序之法
一、理论基点
Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。
TreeMap:基于红黑树(Red-Black-Tree)的NavigableMap实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。
HashMap的值是没有顺序的,它是按照key的hashCode来实现的,对于这个无序的HashMap我们要如何实现排序呢? 参照TreeMap的value排序。
Map.Entry返回Collections视图。
二、TreeMap按照key排序
TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,如下:
import java.util.Comparator;
import java.util.TreeMap; public class TestCd { private static void sortByKeyDesc(){
TreeMap<String, String> tm=new TreeMap<String, String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
tm.put("a", "ddd"); tm.put("b", "ccc");
tm.put("c", "bbb"); tm.put("d", "aaa");
for (String key : tm.keySet()) {
System.out.println("key :"+key+",對應的value:"+tm.get(key));
}
} public static void main(String[] args) {
sortByKeyDesc();
}
运行结果如下:
key :d,對應的value:aaa
key :c,對應的value:bbb
key :b,對應的value:ccc
key :a,對應的value:ddd
三、TreeMap按照value排序
上面的例子是根据TreeMap的可以值来进行排序的,但是有时我们需要根据TreeMap的value来进行排序。对于value排序我们就需要借助于Collection的sort(List<T> list,Comparator<?super T>c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提,那就是所有的元素都必须能够根据所提供的比较器来进行比较,如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap; public class TestCd { private static void sortByValueDesc(){
Map<String, String> tm=new TreeMap<String, String>();
tm.put("a", "ddd"); tm.put("b", "ccc");
tm.put("c", "bbb"); tm.put("d", "aaa");
//这里将map.entrySet()转换成list
List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(tm.entrySet());
//然后通过比较器来实现排序
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//降序排序
@Override
public int compare(Entry<String, String> o1,
Entry<String, String> o2) {
return o2.getValue().compareTo(o1.getValue());
}
}); for(Map.Entry<String,String> mapping:list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
}
public static void main(String[] args) {
sortByValueDesc();
}
}
运行结果:
a:ddd
b:ccc
c:bbb
d:aaa
Java Map集合按照key和value排序之法的更多相关文章
- 过滤掉map集合中key或value为空的值
package cn.com.utils; import org.apache.commons.lang3.StringUtils; import java.util.Collection; impo ...
- Java Map 集合实现类
Map 用于保存具有映射关系的数据,集合里会保存两组值,一组用于保存Map里的key,一组用于保存Map里的value,key与map可以是任何引用类型数据.Map的key不允许重复.key与valu ...
- java Map集合对比分析
1.Map:Map是所有map集合的顶级父接口,用于key/value形式的键值对,其中每一个key都映射到一个值,key不能重复. 2.TreeMap:该map将存储的键值对进行默认排序,并且还能够 ...
- Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.HashMap; import java.util.Iterator; import ...
- Java | Map集合
Map集合 在现实生活中,有非常多的东西,是和另外一种东西对应的,并且还是唯一的,比如:身份证号与个人,个人与手机,一夫一妻...等,这种关系就是对应关系,又叫做映射.Java为这种数据类型提供了专门 ...
- java map集合的知识
/** * Map用于存储键值对,不允许键重复,值可以重复. * (1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度. * H ...
- Java:List集合内的对象进行排序
List集合中的对象进行排序,除了for外,还有java的Collections对象来对摸个集合进行排序的用法. 比如说我有一个List集合,集合元素为: public class TaskAutoE ...
- 获取map集合中key、value
获取Map集合类中key.value的两种方法 方法一:利用Set集合中的keySet()方法 Map<String,String> map = new HashMap<String ...
- Map集合中key不存在时使用toString()方法、valueOf()方法和强制转换((String))之间的区别
1.toString()方法 底层代码 public String toString() { return this; } 其返回值为String类型的字符串本身 Map<String, Obj ...
随机推荐
- 国外成熟的程序交易系统的思路 z
波涛(1998)在<系统交易方法>中提出,一个设计良好的交易系统,必须对投资决策的各个相关环节做出相应明确的规定,同时还必须符合使用者的心理特征.投资对象的统计特征以及投资资金的风险特征. ...
- Sql Server CONVERT获取当前日期及日期样式
Sql Server CONVERT获取当前日期及日期样式(转)(2012-06-06 12:00:24) 转载▼ // 标签: 杂谈 分类: SQL Sql Server CONVERT样式 获取当 ...
- 通过udl文件得到连接字符串
1.新建一个文件,文件名任意,扩展名为udl 2.双击打开这个udl文件 3.点下一步: 4.测试连接成功后点击确定 5.用记事本打开这个udl文件: 连接字符串就出来了
- MFC中添加OpenGL
WINDOWS下展示OpenGL有多种形式: MFC 或 win32,该如何向MFC中添加OpenGL?下面是介绍最简单OpenGL框架. 1.首先通过VS建立MFC应用程序-MyOpenGL,选择单 ...
- 白帽子讲Web安全1.pdf
第一章 我的安全世界观 安全是一个持续过程 6种威胁:Spoofing(伪装).Tampering(篡改).Repudiation(抵赖).InformationDisclosure(信息泄漏).De ...
- JavaScript高级程序设计36.pdf
TreeWalker TreeWalker是NodeIterator的更高级的版本,除了包括nextNode()和previousNode()在内的相同功能外,这个类型还提供了用于不同方向上遍历DOM ...
- C语言snprintf函数
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
- Jquery Mobile左右滑动效果
首先在一个页面里面定义两个< div data-role="page">,这里为了突出重点,就没有写出footer和header.定义的页面如下: <body&g ...
- NIO组件Selector详解
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...
- [TypeScript] Reflection and Decorator Metadata
TypeScript allows you to emit decorator metadata which enables more powerful features through reflec ...