package com.hsy;

import com.alibaba.fastjson.JSON;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.*;

public class Test2 {
public static void main(String[] args) {
Map data = getData();
// String rout = "data>cardList^pltCardNmbr";
String rout = "data>accountList^cmCardNmbr,cmOrgNmbr";
String[] split = rout.split("\\^");
listSort(data, rout);
String json = JSON.toJSONString(data);
System.out.println(rout.indexOf('>'));
}

// data>accountList^acNo,acOrg>Int

static void listSort(Map result, String route) {
if (CollectionUtils.isEmpty(result) || route == null || StringUtils.isEmpty(route.trim()))
return;
//格式化移除空格
route = route.replaceAll(" ", "");

int subIndex = route.indexOf(">");
//无下级key配置,退出
// if (subIndex<0)
// return;
String subRoute = subIndex < 0 ? "" : route.substring(subIndex + 1);

//分解排序关键字
String currRout = route.substring(0, subIndex < 0 ? route.length() : subIndex);
String keyName = currRout.contains("^") ? currRout.split("\\^")[0] : currRout;

//若获取类型为Map
Object subObject = result.get(keyName);
if (subObject instanceof Map) {
//route缩减再递归
if (subIndex > -1) {
listSort((Map) subObject, subRoute);
}
} else if (subObject instanceof List) {
//info
if (!currRout.contains("^"))
return;
String[] split = currRout.split("\\^");
//list类型排序配置错误
if ("".equals(split[1]))
return;
String[] split2 = split[1].split(",");
String[] objects = filterArrEmpty(split2);
//先排序,route缩减,再遍历递归
sortMapList((List) subObject, "", objects);
//递归遍历每个子项
if (subIndex > -1) {
((List) subObject).forEach(info -> {
listSort((Map) info, subRoute);
});
}
}
}

static String[] filterArrEmpty(String[] arr){
List<String> list = new ArrayList<>();
for (String s : arr) {
if (!"".equals(s)){
list.add(s);
}
}
String[] res = new String[list.size()];
String[] strings = list.toArray(res);
return strings;
}

/**
* 将List<Map<String, Object>>中的元素按照其内部Map中的若干字段排序
*
* @param list
* @param compareFields
* @param order
*/
public static void sortMapList(List<Map<String, Object>> list, String order, String... compareFields) {

Comparator<Map<String, Object>> comparetor = new Comparator<Map<String, Object>>() {

private int defineCompare(Object value1, Object value2) {
if (value1 instanceof String && value2 instanceof String) {
return ((String) value1).compareTo((String) value2);
} else if (value1 instanceof Integer && value2 instanceof Integer) {
return ((Integer) value1).compareTo((Integer) value2);
} else if (value1 instanceof Long && value2 instanceof Long) {
return ((Long) value1).compareTo((Long) value2);
} else if (value1 instanceof Double && value2 instanceof Double) {
return ((Double) value1).compareTo((Double) value2);
} else if (value1 instanceof Float && value2 instanceof Float) {
return ((Float) value1).compareTo((Float) value2);
} else if (value1 instanceof BigDecimal && value2 instanceof BigDecimal) {
return ((BigDecimal) value1).compareTo((BigDecimal) value2);
} else {
return -1;
}
}

@Override
public int compare(Map<String, Object> map1, Map<String, Object> map2) {
if (compareFields == null || compareFields.length == 0) {
return 0;
}
int compareResult = 0;
for (int i = 0; i < compareFields.length; i++) {
String compareField = compareFields[i];
Object map1Value = map1.get(compareField);
Object map2Value = map2.get(compareField);
compareResult = defineCompare(map1Value, map2Value);
if (compareResult != 0) {
break;
}
}
return compareResult;
}
};
if ("DESC".equalsIgnoreCase(order)) {
//降序排序
Collections.sort(list, Collections.reverseOrder(comparetor));
} else {
//升序排序
Collections.sort(list, comparetor);
}
}

static Map getData() {
Map map = JSON.parseObject("{\n" +
"\t\"msg\": \"OK\",\n" +
"\t\"code\": \"200\",\n" +
"\t\"data\": {\n" +
"\t\t\"cus2OfficePhoneZone\": \"456 \",\n" +
"\t\t\"crIc\": \"01431229196411103226 \",\n" +
"\t\t\"cus2EmailAddr1\": \"test@tet.qq.com \",\n" +
"\t\t\"crShortName\": \"小河 \",\n" +
"\t\t\"crIdExpDte\": \"20500101\",\n" +
"\t\t\"crIncome\": \"100\",\n" +
"\t\t\"crName2\": \"\",\n" +
"\t\t\"cus2Handphone1\": \"013283408074\",\n" +
"\t\t\"cus2OfficePhoneNoExt\": \"1234 \",\n" +
"\t\t\"crDteBirth\": \"19840116\",\n" +
"\t\t\"cus2HouseOwner\": \"2\",\n" +
"\t\t\"cus2OfficePhoneNo\": \"87003694 \",\n" +
"\t\t\"cus2Education\": \"06\",\n" +
"\t\t\"crName1\": \"小河\",\n" +
"\t\t\"cus2HomePhoneZone\": \"0571\",\n" +
"\t\t\"cus2OfficePhoneCountry\": \"0086\",\n" +
"\t\t\"crIdEffDte\": \"20100101\",\n" +
"\t\t\"crCity\": \" \",\n" +
"\t\t\"cardList\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"cardActivationFlag\": \"Y\",\n" +
"\t\t\t\t\"pltBlockCode\": \" \",\n" +
"\t\t\t\t\"pltActivationCd\": \"1\",\n" +
"\t\t\t\t\"pltDteLstCardExpire\": \"738\",\n" +
"\t\t\t\t\"pltCustomerId\": \"199471027\",\n" +
"\t\t\t\t\"pltRelationship\": \"C\",\n" +
"\t\t\t\t\"pltAccountType0\": \"200\",\n" +
"\t\t\t\t\"pltCardNmbr\": \"633\",\n" +
"\t\t\t\t\"pltAccountOrg0\": \"156\",\n" +
"\t\t\t\t\"pltTypeNmbr\": \"897\",\n" +
"\t\t\t\t\"pltDteCardIssue\": \"20380605\",\n" +
"\t\t\t\t\"pltAccountOrg1\": \"840\",\n" +
"\t\t\t\t\"pltAccountNmbr0\": \"199471027200001\",\n" +
"\t\t\t\t\"pltAccountNmbr1\": \"199471027200001\",\n" +
"\t\t\t\t\"pltChipCardFlag\": \"3\",\n" +
"\t\t\t\t\"pltDteCardExpire\": \"743\",\n" +
"\t\t\t\t\"pltLastActivationCd\": \"0\",\n" +
"\t\t\t\t\"pltStatus\": \"2\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"cardActivationFlag\": \"Y\",\n" +
"\t\t\t\t\"pltBlockCode\": \" \",\n" +
"\t\t\t\t\"pltActivationCd\": \"0\",\n" +
"\t\t\t\t\"pltDteLstCardExpire\": \"843\",\n" +
"\t\t\t\t\"pltCustomerId\": \"199471027\",\n" +
"\t\t\t\t\"pltRelationship\": \"P\",\n" +
"\t\t\t\t\"pltAccountType0\": \"1\",\n" +
"\t\t\t\t\"pltCardNmbr\": \"622\",\n" +
"\t\t\t\t\"pltAccountOrg0\": \"156\",\n" +
"\t\t\t\t\"pltTypeNmbr\": \"783\",\n" +
"\t\t\t\t\"pltDteCardIssue\": \"20401101\",\n" +
"\t\t\t\t\"pltAccountOrg1\": \"840\",\n" +
"\t\t\t\t\"pltAccountNmbr0\": \"199471027001001\",\n" +
"\t\t\t\t\"pltAccountNmbr1\": \"199471027001001\",\n" +
"\t\t\t\t\"pltChipCardFlag\": \"3\",\n" +
"\t\t\t\t\"pltDteCardExpire\": \"943\",\n" +
"\t\t\t\t\"pltLastActivationCd\": \"1\",\n" +
"\t\t\t\t\"pltStatus\": \"2\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"cardActivationFlag\": \"Y\",\n" +
"\t\t\t\t\"pltBlockCode\": \" \",\n" +
"\t\t\t\t\"pltActivationCd\": \"1\",\n" +
"\t\t\t\t\"pltDteLstCardExpire\": \"433\",\n" +
"\t\t\t\t\"pltCustomerId\": \"199471027\",\n" +
"\t\t\t\t\"pltRelationship\": \"P\",\n" +
"\t\t\t\t\"pltAccountType0\": \"1\",\n" +
"\t\t\t\t\"pltCardNmbr\": \"477\",\n" +
"\t\t\t\t\"pltAccountOrg0\": \"156\",\n" +
"\t\t\t\t\"pltTypeNmbr\": \"783\",\n" +
"\t\t\t\t\"pltDteCardIssue\": \"20330305\",\n" +
"\t\t\t\t\"pltAccountOrg1\": \"840\",\n" +
"\t\t\t\t\"pltAccountNmbr0\": \"199471027001001\",\n" +
"\t\t\t\t\"pltAccountNmbr1\": \"199471027001001\",\n" +
"\t\t\t\t\"pltChipCardFlag\": \"3\",\n" +
"\t\t\t\t\"pltDteCardExpire\": \"438\",\n" +
"\t\t\t\t\"pltLastActivationCd\": \"0\",\n" +
"\t\t\t\t\"pltStatus\": \"2\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"cus2CorpName1\": \"老杨公司一段 \",\n" +
"\t\t\"crEuSex\": \"1\",\n" +
"\t\t\"crAcctNbr\": \"199471027\",\n" +
"\t\t\"cus2CorpName2\": \"老杨公司二段 \",\n" +
"\t\t\"accountList\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"addrCity\": \"单位省市\",\n" +
"\t\t\t\t\"cmBlockCode\": \" \",\n" +
"\t\t\t\t\"cmType\": \"1\",\n" +
"\t\t\t\t\"cmOrgNmbr\": \"840\",\n" +
"\t\t\t\t\"cmAltCustomerNmbr\": \"0\",\n" +
"\t\t\t\t\"cmCardNmbr\": \"199471027001001\",\n" +
"\t\t\t\t\"addrAddress2\": \"地址是减肥\",\n" +
"\t\t\t\t\"addrAddress1\": \"二二单位地址\",\n" +
"\t\t\t\t\"addrZipCode\": \"315000\",\n" +
"\t\t\t\t\"cmCycle\": \"10\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"addrCity\": \"单位省市\",\n" +
"\t\t\t\t\"cmBlockCode\": \" \",\n" +
"\t\t\t\t\"cmType\": \"1\",\n" +
"\t\t\t\t\"cmOrgNmbr\": \"156\",\n" +
"\t\t\t\t\"cmAltCustomerNmbr\": \"0\",\n" +
"\t\t\t\t\"cmCardNmbr\": \"199471027001001\",\n" +
"\t\t\t\t\"addrAddress2\": \"地址是减肥\",\n" +
"\t\t\t\t\"addrAddress1\": \"二二单位地址\",\n" +
"\t\t\t\t\"addrZipCode\": \"315000\",\n" +
"\t\t\t\t\"cmCycle\": \"10\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"addrCity\": \"温州市\",\n" +
"\t\t\t\t\"cmBlockCode\": \" \",\n" +
"\t\t\t\t\"cmType\": \"200\",\n" +
"\t\t\t\t\"cmOrgNmbr\": \"156\",\n" +
"\t\t\t\t\"cmAltCustomerNmbr\": \"0\",\n" +
"\t\t\t\t\"cmCardNmbr\": \"199471027000001\",\n" +
"\t\t\t\t\"addrAddress2\": \"大事发生的发生\",\n" +
"\t\t\t\t\"addrAddress1\": \"文昌区\",\n" +
"\t\t\t\t\"addrZipCode\": \"314000\",\n" +
"\t\t\t\t\"cmCycle\": \"15\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"addrCity\": \"单位省市\",\n" +
"\t\t\t\t\"cmBlockCode\": \" \",\n" +
"\t\t\t\t\"cmType\": \"200\",\n" +
"\t\t\t\t\"cmOrgNmbr\": \"840\",\n" +
"\t\t\t\t\"cmAltCustomerNmbr\": \"0\",\n" +
"\t\t\t\t\"cmCardNmbr\": \"199471027200002\",\n" +
"\t\t\t\t\"addrAddress2\": \"地址是减肥\",\n" +
"\t\t\t\t\"addrAddress1\": \"二二单位地址\",\n" +
"\t\t\t\t\"addrZipCode\": \"315000\",\n" +
"\t\t\t\t\"cmCycle\": \"20\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"crBlock\": \" \",\n" +
"\t\t\"crEuMaritalStatus\": \"2\",\n" +
"\t\t\"crState\": \" \",\n" +
"\t\t\"cus2HomePhoneNo\": \"18918689402 \",\n" +
"\t\t\"addrList\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"addrZipCode\": \"313000\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"addrZipCode\": \"315000\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"addrZipCode\": \"314000\"\n" +
"\t\t\t}\n" +
"\t\t]\n" +
"\t},\n" +
"\t\"list\": null\n" +
"}");
return map;
}
}

tempcode排序的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  3. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  4. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  5. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  6. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  7. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  8. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

  9. iOS自定义model排序

    在开发过程中,可能需要按照model的某种属性排序. 1.自定义model @interface Person : NSObject @property (nonatomic,copy) NSStri ...

  10. Lucene4.4.0 开发之排序

    排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最 ...

随机推荐

  1. MaxCompute执行引擎核心技术DAG揭秘

    ​简介: 作为业界少有的EB级数据分布式平台,MaxCompute每天支撑上千万个分布式作业的运行.这些作业特点各异,既有包含数十万计算节点的超大型作业,也有中小规模的分布式作业.不同用户对于不同规模 ...

  2. 浏览器扩展开发-Firefox临时载入附加组件(图)

    科普:[FE] Quasar BEX 热加载区别: Chrome vs Firefox 1. 2.  3. Thats all. Refer:Firefox扩展开发 Link:https://www. ...

  3. 【web安全】隐藏nginx头文件信息

    摘要 Nginx作为开源web中间件,被广泛应用.因此源编译或者yum安装,都会带有其原有的nginx版本.很容易被针对,因此,通过修改nginx的源码.隐藏nginx版本和头部信息,保障nginx的 ...

  4. 一个list分成 list长度/step_length 向上取整个小list集合

    一.具体实现方法 /** * 将一个list按照新的步长分成list长度/step_length 向上取整个小list * @param list * @param step_length * @re ...

  5. 在jeecg-boot中使用代码生成器&mybatis-plus

    一.代码生成器代码生成器-->jeecgOneGUI配置文件:resource/jeecg/jeecg_config.properties,修改目标生成的路径和包名数据库连接:resource/ ...

  6. 机器学习策略篇:详解为什么是人的表现?(Why human-level performance?)

    为什么是人的表现? 在过去的几年里,更多的机器学习团队一直在讨论如何比较机器学习系统和人类的表现,为什么呢? 认为有两个主要原因,首先是因为深度学习系统的进步,机器学习算法突然变得更好了.在许多机器学 ...

  7. 密码学—RSA公钥算法Python程序

    RSA流程 选取两个素数p,q,保密p,q 计算出n = p×q ,公开n 计算φ(n)=(p-1)(q-1) ,保密φ(n) 选择一个数e ,e满足:e < φ(n) , gcd(e,φ(n) ...

  8. UnityShader数学基础篇

    Mathf Mathf和Math 1.Math是C#中封装好的用于数学计算的工具类,位于System命名空间中. 2.Mathf是Unity中封装好的用于数学计算的工具结构体,位于UnityEngin ...

  9. Python:conda install 和pip install的区别

    pip是个安装包的软件,conda是个环境管理的工具.conda能够安装多个python解释器,pip不行.因此conda在实际开发中是主要用来隔离不同的python版本和Tensorflow& ...

  10. Python读Excel数据自动化填入日常办公的网页表单

      前言 本篇内容,让你完全掌握Python是如何自动化办公的~ 一.环境准备 1.1  Python 3.7.0 1.2  Pycharm  (Python 开发工具) 1.3 Selenium  ...