根据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类,聊天 ...
随机推荐
- BZOJ - 2588 Spoj 10628. Count on a tree (可持久化线段树+LCA/树链剖分)
题目链接 第一种方法,dfs序上建可持久化线段树,然后询问的时候把两点之间的所有树链扒出来做差. #include<bits/stdc++.h> using namespace std; ...
- HDU - 5307 :He is Flying (分治+FFT)(非正解)
JRY wants to drag racing along a long road. There are nn sections on the road, the ii-th section has ...
- Equation
You are given an equation: Ax2 + Bx + C = 0. Your task is to find the number of distinct roots of th ...
- C#获取路由器外网IP,MAC地址
C#实现的获取路由器MAC地址,路由器外网地址.对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码.至于获取路由器的外网IP地址,可以不需要知道路由器web管理系统的用户名和密 ...
- 利用MsChart控件绘制多曲线图表
在.Net4.0框架中,微软已经将Mschart控件集成了进来,以前一直在web下面用过,原来winform下的Mschart控件更加简单更加方便,今天我们用mschart绘制一个多曲线图,发现MsC ...
- 使用Jsonp实现跨域请求
来自百度百科的一段话: JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1.exampl ...
- Sentry入门
指令类型: 创建.删除角色: CREATE ROLE sentry_all; droop role admin_role; 角色授权/撤销权限: 数据库级别角色授权 GRANT ALL ON DA ...
- bzoj 3160 万径人踪灭——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 似乎理解加深了. 用卷积算相同的位置:先把 a 赋成1. b 赋成0,卷积一遍:再把 ...
- BZOJ4154:[IPSC2015]Generating Synergy
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- php之laravel学习
http://laravel-china.github.io/php-the-right-way/#composer_and_packagist laravel 添加 dingoapi路由插件 并运用 ...