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. USB3.0 转USB3.0

    前段时间因为项目需求需要将相机的USB3.0口转接出来,心想那还不想简单,结果第一次就碰壁了:先说一下usb3.0的引脚定义如图: 九个脚,2个地:注意USB3.0转3.0时数据线全交叉,DM-和DP ...

  2. codeql初探

    CodeQL初探 环境搭建 基于Windows 基于Mac 下载codeql https://github.com/github/codeql-cli-binaries/releases/latest ...

  3. building sasl.wrapper extention

    yum install gcc-c++ python-devel.x86_64 cyrus-sasl-devel.x86_64 pip install pyhs2 ref: https://www.o ...

  4. windows 上搭建 sftp 服务器 -freesshd全过程( 在linux上部署逐浪CMS的必读教程)

    文章标题: windows 上搭建 sftp 服务器 - freesshd全过程 关键字 : freesshd 文章分类: 教程 创建时间: 2020年3月23日 缘由 动手 第一步:添加用户 第二步 ...

  5. 菜鸡的Java笔记 开发支持类库

    开发支持类库 SupportClassLibrary        观察者设计模式的支持类库                    content (内容)        什么是观察者设计模式呢?   ...

  6. 菜鸡的Java笔记 第二十八 - java 包的定义

    包的主要作用以及定义    包的导入操作    系统常见的开发包    jar 程序命令        包的定义        在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...

  7. [cf559E]Gerald and Path

    将所有线段的端点(即$a_{i}$和$a_{i}\pm l_{i}$)离散,并按照$a_{i}$从小到大排序 定义$f_{i,,j}$表示前$i$条线段在位置$j$之前最多能覆盖的长度(默认覆盖到$j ...

  8. 分布式事务(七)之Seata简介

    在前面的文章中,我们介绍了分布式事务的概念以及一些解决方案.fenSeata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用户提供了AT.TCC.SAGA和 ...

  9. 初识XSS攻击

    初识XSS攻击 本文参考于<白帽子讲Web安全>第3章跨站脚本攻击(XSS),该书出版于2014年,因而现在可能存在一些新场景或新技术而未被提及,但本文对学习和了解XSS攻击仍具有重要价值 ...

  10. 使用bootstrap-table时导出excel开头的0被自动省略

    原因是excel"智能"识别数据格式,有时聪明反被聪明误. 解决方案:修改tableExport.js 搜索: if (typeof tdcss != 'undefined' &a ...