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工具的更多相关文章

  1. Map排序——按key排序,按value排序

    注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5959279.html 上一篇博文谈到了集合类的自定义排序方式,那么进一步扩展开来,与集合同等重要的Map有 ...

  2. Map排序(按key排序,按value排序)

    主要分两种,按键排序.按值排序. 而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用. 一.按键排序 按Key排序主要用于TreeMap,可以实现按照Key值的大小 ...

  3. Java Map按键(Key)排序和按值(Value)排序

    Map排序的方式有很多种,两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value).1.按键排序jdk内置的java.util包下的TreeMap<K,V ...

  4. Java Map 按Key排序和按Value排序

    Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value). 1.按键排序 jdk内置的java.util包下的Tr ...

  5. C++ STL中Map的按Key排序和按Value排序

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...

  6. C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET

    C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...

  7. 封装一个Ajax工具函数

    /*封装一个ajax工具函数*/ window.$ = {}; /*通过$定义一个ajax函数*/ /* * 1. type   string   请求的方式  默认是get * 2. url     ...

  8. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  9. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

随机推荐

  1. sqlalchemy delete object

    In SQL Alchemy you are deleting Objects that you get with a query from the database. This you can do ...

  2. 截取oracle字符串中的数字

    方法一:如果Oracle版本不是太低的话,使用 正则表达式函数 REGEXP_SUBSTR 处理. REGEXP_SUBSTR有5个参数,分别是: 第一个是输入的字符串 第二个是正则表达式 第三个是标 ...

  3. 编译使用nginx

    nginx-1.18.0 ./configure --prefix=$HOME/nginx --with-http_ssl_module make -j32; make install [fangju ...

  4. Java 插入html字符串到PPT幻灯片

    通过Java后端代码操作PPT幻灯片时,可直接在幻灯片中绘制形状,并在形状中添加文本字符串内容.本篇文章,介绍一种通过html字符串来添加内容到PPT幻灯片的的方法,可添加文字.图片.视频.音频等.下 ...

  5. springboot和springcloud版本上的选择

    现在的springboot项目和cloud版本都是更新很快,但我们开发不是版本越新越好,我们要把版本对应起来,那么我们怎么去关联呢? springboot和springcloud不是越新越好,clou ...

  6. 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)

    题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...

  7. 洛谷 P7515 - [省选联考 2021 A 卷] 矩阵游戏(差分约束)

    题面传送门 emmm--怎么评价这个题呢,赛后学完差分约束之后看题解感觉没那么 dl,可是现场为啥就因为种种原因想不到呢?显然是 wtcl( 先不考虑"非负"及" \(\ ...

  8. Codeforces 521D - Shop(贪心)

    Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的贪心,可惜又没自己想出来,显然省选之后我的能力呈 \(y=-1145141919810192608179998244353x ...

  9. DirectX12 3D 游戏开发与实战第九章内容(上)

    仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...

  10. 使用FastqCount统计fastq文件基本信息?

    目录 1. FastqCount简介 2. 使用 3. 结果 1. FastqCount简介 快速实用小工具:FastqCount https://github.com/zhimenggan/Fast ...