根据Value对Map中的对象进行排序
背景
SortedMap的实现类TreeMap可以按自然顺序或自定义顺序遍历键(key),有时我们需要根据值(Value)进行排序,本文提供了一种简单实现思路。
实现
Comparator接口
使用Value排序时,仍然使用TreeMap实现类,只不过需要在TreeMap的构造函数中引入Comparator实现。TreeMap构造器
ValueComparator是Comparator接口的实现,该实现包含了一个普通的Map对象作为成员变量,并在compare方法中做了一点手脚。即在compare方法中,将key的比较转换为value的比较。- 局限性
这种方式只能对Map进行排序,而不能添加单个key-value映射。
具体实现代码
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap; /**
* Created by liutingna on 2017/9/30.
*/
public class TestComparator {
class ValueComparator implements Comparator<String> { Map<String, Long> base; //Comparator外部比较器
public ValueComparator(Map<String, Long> base) {
this.base = base;
} //根据Map的值进行比较
public int compare(String a, String b) {
return base.get(a).compareTo(base.get(b));
}
} public static void main(String[] args) {
Map<String, Long> map = new HashMap<>();
TestComparator testComparator = new TestComparator();
TestComparator.ValueComparator valueComparator = testComparator.new ValueComparator(map);
Map<String, Long> keySortMap = new TreeMap<>();
Map<String, Long> valueSortMap = new TreeMap<>(valueComparator); map.put("aaa", 15L);
map.put("bxw", 13L);
map.put("abc", 14L);
map.put("bbb", 18L);
System.out.println(map);//{aaa=15, bxw=13, abc=14, bbb=18} //根据key进行比较
keySortMap.putAll(map);
System.out.println(keySortMap);//{aaa=15, abc=14, bbb=18, bxw=13}
//根据value进行比较
valueSortMap.putAll(map);
// valueSortMap.put("ccc",17L);//NullPointerException,这种方式只能对Map进行排序,而不能添加单个key-value映射
System.out.println(valueSortMap);//{bbb=18, aaa=15, abc=14, bxw=13}
}
}
相关资料
根据Value对Map中的对象进行排序的更多相关文章
- NSArray中的对象进行排序
看在iOS中有哪些方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor进行排序 使用selector进行排序 小引 我们将要 ...
- 对list集合中的对象进行排序(转载)
原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元 ...
- C++ Vector 中自定义对象的排序
需求: 客户端收到游戏中的所有联盟列表,现在需要按联盟的属性比如lv来进行排序. 数据存储: 每个联盟数据是一个对象,所有的联盟列表存在一个vector容器里面. 老的解决方法: 冒泡排序方法算法 新 ...
- 如何根据对象的属性,对集合(list / set)中的对象进行排序
一:针对list 通过java.util.Collections的sort方法,有2个参数,第一个参数是list对象,第二个参数是new Comparator<对象类>(){}方法,这 ...
- 根据List集合中的对象属性排序
首先创建一个Student对象,里面有三个属性,分别是int类型,String类型,Date类型 package com.sinoway.cisp.test; import java.text.Sim ...
- List集合中的对象进行排序
类A: public class A implements Comparable<A>{ private Integer id; private String name; public A ...
- 根据map中某一字段排序
以上是从小到大的排序...要注意.! 需要jdk8...
- Java中对JSONArray中的对象进行排序
String jsonArrStr = "[ { \"ID\": \"135\", \"Name\": \"Fargo ...
- iOS探索:对NSArray中自定义的对象进行排序
http://mobile.51cto.com/hot-434804.htm 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天 ...
随机推荐
- MySQL实战 | 05 如何设计高性能的索引?
原文链接:MySQL | 05 如何设计高性能的索引? 上回我们主要研究了为什么使用索引,以及索引的数据结构.今天带你了解如何设计高性能的索引. 其中,有这么一个点,说的是 InnoDB 引擎中使用的 ...
- BZOJ5341: [Ctsc2018]暴力写挂
BZOJ5341: [Ctsc2018]暴力写挂 https://lydsy.com/JudgeOnline/problem.php?id=5341 分析: 学习边分治. 感觉边分治在多数情况下都能用 ...
- django的get_or_create
转:http://www.nanerbang.com/article/51/ get_or_create会根据条件从数据库里面查找符合条件的记录,如果没有符合条件的记录,则新创建一条记录
- jraiser模块加载执行简要总结
1 在html文件中,通过require方式来加载指定的入口文件:2 然后通过正则表达式来匹配入口文件中的所有require的依赖文件:注意,此时入口文件已加载完毕,不过,还没执行而已.3 之后逐一通 ...
- Kubernetes创建挂载共享存储的容器
原文链接:https://www.58jb.com/html/135.html 在上一次的Mysql容器中,已经使用过了配置宿主机目录挂载的方式,这样虽然方便但是不够安全:一般都是把数据存储在远程服务 ...
- MySQL 查询数据表里面时间字段为今天添加的计数
一: 下面这条语句查出来的count值 . 查询类型ID(category_id)为18的,今天插入的数据数, created_on: 为数据表中一字段 datetime类型, 记录此条数据添加的时 ...
- 备份Ubuntu系统
1.工具:再生龙 2.备份方法:使用再生龙将系统备份(在U盘/boot目录下有很多文件),可以通过这个U盘去装机.将这个U盘生成的文件发送给应用,应用会将其打包生成iso可发布版本: 3.操作步骤:
- el表达式对js方法的传值
我常用于在jsp页面遍历集合和分页中的页面跳转事件. jsp: <!-- 引入jstl --> <%@ taglib prefix="c" uri="h ...
- Day2-VIM(六): 恢复
恢复在VIM里比较简单,不过想要具体恢复到某个时间段很难 就我的经验而言,有时候使用恢复还不如删了重写 这里我们来讲讲恢复.撤销和重复命令的使用 u 撤消上次命令 U 恢复整行 ctrl+r 重做 . ...
- X509 文件扩展名
编码 (也用于扩展名) .DER = 扩展名DER用于二进制DER编码的证书.这些证书也可以用CER或者CRT作为扩展名.比较合适的说法是“我有一个DER编码的证书”,而不是“我有一个DER证书”. ...