封装一个按Key排序的Map工具
Map是集合的存放顺序是按哈希值定的,有时候不是我们需要的,当想要一个按自己规定顺序存放顺序,可以用LinkedHashMap,这里自己把LinkedHashMap封装了一次
package test.com.reflect; import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet; public class MapUtill {
public static void main(String[] args) {
Map<Object,Object> map1 = newMap("{'id':'主键','age':'年龄','name':'姓名','className':'班级','area':{'code':'代码','name':'地名','as':'的'},'strs':'发大发'} ",true);
System.err.println(map1);
// --------------------------------------------------------------------------------
Map<Integer,String> map = new HashMap<>();
map.put(2342, "a1");
map.put(1231, "a2");
map.put(24355, "a3");
map.put(123, "a4");
System.err.println(map);
// --------------------------------------------------------------------------------
Object[] arr = sortKeysArray(map,new Comparator<Integer>() { @Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
} });
System.err.println(Arrays.toString(arr));
// --------------------------------------------------------------------------------
Set<Integer> set = sortKeysSet(map,new Comparator<Integer>() { @Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
} });
System.err.println(set);
// --------------------------------------------------------------------------------
List<Integer> list = sortKeysList(map,new Comparator<Integer>() { @Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
} });
System.err.println(list); }
/** 返回一个按添加顺序存放的map
* @return
*/
public static <V, K> Map<K,V> newMap(){
return new LinkedHashMap<K,V>();
} public static Map<Object,Object> newMap(String txt){
return newMap(txt,false);
} /**
* @param txt Map字符串
* @param sort 是否按txt 排序生成
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map<Object,Object> newMap(String txt,Boolean sort){
com.alibaba.fastjson.JSONObject jsonObj = com.alibaba.fastjson.JSONObject.parseObject(txt);
if(!sort) {
return (Map)jsonObj;
}
final String t = txt;
// Map<String, Object> rs = sort(jsonObj,new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// if(t.indexOf(o1)> t.indexOf(o2)) {
// return 1;
// }
// if(t.indexOf(o1)< t.indexOf(o2)) {
// return -1;
// }
// return 0;
// }
// }); Object[] arrKeys = sortKeysArray((Map)jsonObj,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(t.indexOf(o1)> t.indexOf(o2)) {
return 1;
}
if(t.indexOf(o1)< t.indexOf(o2)) {
return -1;
}
return 0;
}
}); Map<String, Object> rs = newMap();
for (int i = 0; i < arrKeys.length; i++) {
Object v = jsonObj.get(arrKeys[i]);
if(v instanceof Map) {
int key = txt.indexOf((String)arrKeys[i]);
int index1 = txt.indexOf("{", key);
int index2 = txt.indexOf("}", index1);
v = newMap(txt.substring(index1,index2+1),false);
}
rs.put((String)arrKeys[i], v);
}
return (Map)rs;
} /**
* @param map
* @param comparator
* @return
*/
public static <K, V> Map<K,V> sort(Map<K,V> map,Comparator<K> comparator){
Map<K, V> rs = newMap();
K[] arrKeys = sortKeysArray(map,comparator);
for (K k : arrKeys) {
rs.put(k, map.get(k));
}
return rs;
} /**
* @param map
* @param comparator
* @return Object[] 不能用K[] 来接收
*/
@SuppressWarnings("unchecked")
public static <K, V> K[] sortKeysArray(Map<K,V> map,Comparator<K> comparator) {
Set<K> keys = map.keySet();
K[] arr = (K[])(new Object[keys.size()]);
K[] arrKeys = keys.toArray(arr);
Arrays.sort(arrKeys,comparator);
return arr;
}
/**
* @param map
* @param comparator
* @return
*/
public static <K, V> Set<K> sortKeysSet(Map<K,V> map,Comparator<K> comparator) {
return new TreeSet<>(sortKeysList(map,comparator));
} /**
* @param map
* @param comparator
* @return
*/
public static <K, V> List<K> sortKeysList(Map<K,V> map,Comparator<K> comparator) {
K[] keys = sortKeysArray(map,comparator);
return Arrays.asList(keys);
}
}
封装一个按Key排序的Map工具的更多相关文章
- Map排序——按key排序,按value排序
注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5959279.html 上一篇博文谈到了集合类的自定义排序方式,那么进一步扩展开来,与集合同等重要的Map有 ...
- Map排序(按key排序,按value排序)
主要分两种,按键排序.按值排序. 而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用. 一.按键排序 按Key排序主要用于TreeMap,可以实现按照Key值的大小 ...
- Java Map按键(Key)排序和按值(Value)排序
Map排序的方式有很多种,两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value).1.按键排序jdk内置的java.util包下的TreeMap<K,V ...
- Java Map 按Key排序和按Value排序
Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value). 1.按键排序 jdk内置的java.util包下的Tr ...
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET
C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...
- 封装一个Ajax工具函数
/*封装一个ajax工具函数*/ window.$ = {}; /*通过$定义一个ajax函数*/ /* * 1. type string 请求的方式 默认是get * 2. url ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
随机推荐
- 【linux系统】命令学习(二)文件处理命令
查看帮助 1.--help 例如:ls --help 会有中文 2.man 例如:man ls 都是英文 进入手册的界面 空格键:向下翻页 回车:一行一行翻页 B:向前翻页 ...
- centos7.1使用kubeadm部署kubernetes 1.16.2的master高可用
机器列表,配置域名解析 cat /etc/hosts192.168.200.210 k8s-master1192.168.200.211 k8s-master2192.168.200.212 k8s- ...
- Maven 依赖调解源码解析(六):dependencyManagement 版本锁定
本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第六篇,主要介绍 dependencyManagement 版本锁定原则.请按顺序阅读其他系列文章,系列文章总目录参见:htt ...
- SQL中单引号和双引号
比如说: String sql = "select * from clients where logname='" + name + "'and password='&q ...
- [atARC127F]±AB
(为了方便,以下除$V$外都改为小写字母) 结论1:若$a+b\le m+1$,则答案为$m+1$(即任意$x$都可以被得到) 任取$y\in [0,m]$,由$\gcd(a,b)=1$存在$y-V= ...
- [spojQTREE5]Query on a tree V
合理的正解大概是动态点分治,这里给出其实现 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 st ...
- [bzoj1305]跳舞
考虑如果没有k个人,那么就是裸的二分答案+最大流对于这k个人,再在原来的每一个点裂点,中间的流量为k,然后裂出来的点向所有不能匹配的点连边,再二分答案+最大流即可 1 #include<bits ...
- 微信和QQ这么多群,该如何管理好友关系?
本文节选自<设计模式就该这样学> 1 中介者模式的应用场景 在现实生活中,中介者的存在是不可缺少的,如果没有了中介者,我们就不能与远方的朋友进行交流.各个同事对象将会相互进行引用,如果每个 ...
- 在安卓开发中需要格式化桌面icon图标
使用以下在线工具即可实现http://www.makeicon.cc/home/index
- Python之浏览器的前进或后退
import webbrowserwebbrowser.back() 后退webbrowser.forward() 前进