封装一个按Key排序的Map工具

Map是集合的存放顺序是按哈希值定的,有时候不是我们需要的,当想要一个按自己规定顺序存放顺序,可以用LinkedHashMap,这里自己把LinkedHashMap封装了一次

package test.com.reflect;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class MapUtill {
    public static void main(String[] args) {
        Map<Object,Object> map = newMap("{‘id‘:‘主键‘,‘age‘:‘年龄‘,‘name‘:‘姓名‘,‘className‘:‘班级‘,‘area‘:{‘code‘:‘代码‘,‘name‘:‘地名‘,‘as‘:‘的‘},‘strs‘:‘发大发‘} ",true);
//        map.putAll(m);
        System.err.println(map);
    }
    public static Map<Object,Object> newMap(){
        return new HashMap<Object,Object>();
    }

    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 = sortKeys((Map)jsonObj,new Comparator<Object>() {
            @Override
            public int compare(Object o1, Object o2) {
                if(t.indexOf((String)o1)> t.indexOf((String)o2)) {
                    return 1;
                }
                if(t.indexOf((String)o1)< t.indexOf((String)o2)) {
                    return -1;
                }
                return 0;
            }
        });

        LinkedHashMap<String, Object> rs = new LinkedHashMap<>();
        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;
    }

    public static  <K, V> Map<K,V> sort(Map<K,V> map,Comparator<K> comparator){
        LinkedHashMap<K,V> rs = new LinkedHashMap<K,V>();
        K[] arrKeys = sortKeys(map,comparator);
        for (K k : arrKeys) {
            rs.put(k, map.get(k));
        }
        return rs;
    }

    @SuppressWarnings("unchecked")
    private static <K, V> K[] sortKeys(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 arrKeys;
    }

}

原文地址:https://www.cnblogs.com/jonrain0625/p/11191516.html

时间: 2024-10-15 17:54:07

封装一个按Key排序的Map工具的相关文章

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

主要分两种,按键排序.按值排序. 而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用. 一.按键排序 按Key排序主要用于TreeMap,可以实现按照Key值的大小,在对象插入时直接插入到合适的位置,保持Map的顺序性. 来看TreeMap的构造函数:TreeMap(Comparator<? super K> comparator):构造一个新的.空的树映射,该映射根据给定比较器进行排序. 这里的比较器是key的比较器.所以定义比较器时用于比较的两个参数是K

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

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

封装一个Ajax工具函数

/*封装一个ajax工具函数*/ window.$ = {}; /*通过$定义一个ajax函数*/ /* * 1. type   string   请求的方式  默认是get * 2. url    string   请求地址  接口地址 * 3. async  boolean  默认的是true * 4. data   object   {}请求数据 * * 5.success function  成功回调函数 * 6.error   function  失败的回调函数 * */ $.ajax

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

Map排序的方式有很多种,两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value).1.按键排序jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法 TreeMap(Comparator<? super K> comparator)  传入我们自定义的比较器即可实现按键排序. Java代码   public class MapSortDemo { public static void main(Strin

用c++封装一个Hash Table,并与STL map 进行操作性能上的比较

问题描述: 1.在计算机科学中,hash table 是一种常用的数据结构,它本质上是一种关联容器,它映射一个key 到value.它通过一个hash function把key映射成一个整数值,这个整数值对应存放value值的容器的下标. 2.它主要支持三种操作:插入key,value对(insert),查询(search)给定key, 删除key, value对(delete); 3.它三种操作的平均时间复杂度为O(1),最糟糕情况下的时间复杂度为O(n): 4.hash table要处理核心

C++ STL中Map的按Key排序跟按Value排序(转)

C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学生姓名快速的查找到 他的成绩. 但是,我们除了希望能够查询

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

封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创建Logger类,完整代码如下: using NLog; using NLog.Config; using NLog.Mongo; using NLog.Targets; using System; using System.Collections.Generic; using System.IO;

C++基础之map按key排序

在项目当中有要用到map按key排序的需求,就在百度上搜了一下: typedef pair<int,int> PAIR; int cmp(const PAIR& x, const PAIR& y) { return x.second < y.second; } map<int,int> imgdis; //待排序对象,根据double值排序 imgdis[1] = 3; imgdis[10] = 1; imgdis[3] = 5; imgdis[12] = 4

获取map中的一个value值以及遍历map获得map里所有key、value的值

前言: 1.声明一个map: Map map = new HashMap();2.向map中放值,注意:map是key-value的形式存放的.如: map.put(”sa”,”dd”); 3.从map中取值:String str = map.get(”sa”).toString();结果是:str = ”dd”;4.遍历一个map,从中取得key 和valueMap map = new HashMap() ; Iterator it = map.entrySet().iterator() ;w