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. Could not set property 'id' of 'class com.xxx.xxEntity'

    使用mybatisplus的save功能时,系统报错如下: Could not set property 'id' of 'class com.xxx.xxEntity' with value '13 ...

  2. macos command 'clang' failed with exit status 1

    export CC=$(which gcc)export CXX=$(which g++)pip install fbprophet CC=clang pip install gevent

  3. easyui comboBox的多选框之疑难杂症——逗号篇

    提笔写正文之前,首先要再次提醒一下自己,因为总是记不住,以至大神同事们都开始用"嫌弃"的眼光看自己了--         记得使用easyui中的combobox吗?效果是酱紫滴: ...

  4. vue如何写组件(script标签引入的方式)

    很多人知道.vue结构的单文件组件形式,不过这种单文件组件的结构如果要加入到现有的jquery项目中就比较麻烦了,那如果我们又想用vue来写模板,又不想引入vue-cli管理,那该怎么来写组件呢?别着 ...

  5. layui 如果调用 from 内嵌入的 iframe子页面方法

    (人笨,占时想法的办法,不要骂,不要骂,怕了怕了,想到别的会来改的) 父页面; <%@ page language="java" contentType="text ...

  6. Java将增加虚拟线程,挑战Go协程

    我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制.一个 go 语句就可以发起一个协程 (goroutin).协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是 ...

  7. 简易发号SQL,可用于生成指定前缀自增序列--改进版

    使用merge语法实现新增or更新 首先创建表 CREATE TABLE Test.dbo.Increments ( Prefix varchar(50) NOT NULL, [MaxNum ] bi ...

  8. DTOJ 3987: 数学课

    题目描述 wzy又来上数学课了-- 虽然他很菜,但是数学还是懂一丢丢的.老师出了一道题,给定一个包含$n$个元素的集合$P=1,2,3--n$求有多少集合$A \subseteq P$,满足$x \i ...

  9. 深入理解 OpenFOAM 环境变量与编译

    操作系统选择 由于 OpenFOAM 在 Linux 平台开发和测试,在非 Linux 平台无法直接对软件进行编译和安装,所以在非 Linux 平台上最简便方法是使用 docker 容器运行 Open ...

  10. mac 下 如何在同一窗口打开多个终端并实现快捷键切换

    相信大家编代码的时候都会遇到,每次需要在头文件,库文件和源码文件中编代码的时候,总是需要在几个文件中切换来切换去的,而且一个文件就一个终端窗口,每次都要用鼠标点来点去,非常麻烦,所以如果能把这几个文件 ...