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. 表格存储 SQL 查询多元索引

    ​简介: 多元索引是表格存储产品中一个重要的功能,多元索引使用倒排索引技术为表格存储提供了非主键列上的快速检索功能,另外也提供了统计聚合功能.表格存储近期开放了SQL查询功能,SQL引擎默认从原始表格 ...

  2. [Gse] 高效的Golang中文分析库推荐

    优点:用法简单,支持各种语言,基本满足需求. 缺点:默认分词字典文件有 8M 需测试使用速度. 我们可以直接封装一个简单的辅助方法来实现分词功能: // @author cnblogs.com/far ...

  3. IIncrementalGenerator 增量 Source Generator 生成代码应用 将构建时间写入源代码

    本文将和大家介绍一个 IIncrementalGenerator 增量 Source Generator 生成代码技术的应用例子,将当前的构建时间写入到代码里面.这个功能可以比较方便实现某些功能的开关 ...

  4. 2018-12-26-WPF-开启-ScrollViewer-的触摸滚动

    title author date CreateTime categories WPF 开启 ScrollViewer 的触摸滚动 lindexi 2018-12-26 14:24:26 +0800 ...

  5. K8s集群中部署SpringCloud在线购物平台(一)

    一.安装k8s高可用集群 主机名 IP 配置 网络 master控制节点 192.168.10.10 centos 7.9 4核4G 桥接 node1工作节点 192.168.10.11 centos ...

  6. Codeforces Good Bye 2023

    A. 2023 正常签到. void solve() { int n, k, ok = 1; cin >> n >> k; int t = 2023; while(n --) ...

  7. gin里获取http请求过来的参数

    https://www.bilibili.com/video/av68769981/?p=2 课程代码: https://www.qfgolang.com/?special=ginkuangjia&a ...

  8. JS基础--JavaScript实例集锦(初学)

    1.子节点childNodes: <!DOCTYPE html> <html> <head> <title>childNodes</title&g ...

  9. Java变量自增表达式 i = i++ 的底层逻辑(简述)

    Java变量自增表达式 i = i++ 的底层逻辑(简述) 前言 很多老师告诉我们,i = i++ 的运算过程是 temp = i; i ++; i = temp; 所以i的值不变.但我总觉得这个te ...

  10. Javascript/DOM:如何删除 DOM 对象的所有事件侦听器

    Javascript/DOM:如何删除 DOM 对象的所有事件侦听器 一.重写 重写 EventTarget 添加监听事件方法 addEventListener if (EventTarget.pro ...