封装一个按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的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
随机推荐
- 使用Charles请求跳转可作为线上和线下环境的切换
举个例子: 1.后端拿测试环境的客户端调试本地的代码 2.连接后端本地服务测试客户端和后端的交互 这样就可以改变客户端请求的测试环境换成其他的环境 一.配置 tools--Map remot... 这 ...
- inline-block布局VS浮动布局
a.不同之处:对元素设置display:inline-block ,元素不会脱离文本流,而float就会使得元素脱离文本流,且还有父元素高度坍塌的效果 b.相同之处:能在某程度上达到一 ...
- Qt Creator 源码学习笔记01,初识QTC
阅读本文大概需要 4 分钟 Qt Creator 是一款开源的轻量级 IDE,整个架构代码全部使用 C++/Qt 开发而成,非常适合用来学习C++和Qt 知识,这也是我们更加深入学习Qt最好的方式,学 ...
- rm命令弱爆了!
大家好,我是良许. 创建.删除和修改文件是用户在 Linux 系统中执行的非常常见操作.大家都知道,在 Linux 系统里使用 rm 命令删除单个文件时,几乎一瞬间就完成了.但是如果文件数量很大,那么 ...
- scanner对象,顺序及选择结构
scanner对象 基本语法: Scanner s = new Scanner(System.in) 使用next()和nextLine()读取前,使用hasNext()和hasNextLine()来 ...
- base64和图片转换
Base64是一种8Bit字节数据的编码方式. 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况.与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文 ...
- awk多文件处理时的分隔符?
目录 问题来源 解决方法 问题来源 我有两个文件,一个是plink过滤后得到的.fam文件(空格分隔):另一个是样本对应关系文件(tab分隔). 文件1: 文件2: 两个文件匹配,awk常规操作.这里 ...
- TOMCAT 搭建
第一步:下载 软件 和 JDK 第二个:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html 传输到Linux里. ...
- MySQL:事务常用语句
Mysql(版本是8)的事务隔离级别 默认是RR:REPEATABLE-READ:可重复读 查看 当前隔离级别 全局隔离级别 修改 -- 当前修改 -- 设置成可重复读 SET transactio ...
- 日常Java测试 2021/11/14
课堂测试三 package word_show; import java.io.*;import java.util.*;import java.util.Map.Entry; public clas ...