package com.jd.dashboard.util; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.jd.big.data.common.dashboard.model.DeptMonitorStoreVo; import com.jd.big.data.common.dashboard.model.DeptMonitorVo; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 分部门级别的排序的排序 * Created by niewj on 2016/10/20. */ public class SortUtil { /** * 按照部门父子顺序排序:1.父子部门;2.同级别内按照value值倒序 * * @param list 所有的节点 * @return */ public static List<? extends DeptMonitorVo> sortAllDeptLevelList(List<? extends DeptMonitorVo> list) { if (list == null || list.isEmpty()) { return list; } /** * 1.分成4组 */ List<DeptMonitorVo> listBu = new ArrayList<>(); List<DeptMonitorVo> listDept1 = new ArrayList<>(); List<DeptMonitorVo> listDept2 = new ArrayList<>(); List<DeptMonitorVo> listDept3 = new ArrayList<>(); for (DeptMonitorVo vo : list) { if (vo.getBu_id() != null && vo.getDept_id_1() == null) { listBu.add(vo); } else if (vo.getBu_id() != null && vo.getDept_id_1() != null && vo.getDept_id_2() == null) { listDept1.add(vo); } else if (vo.getBu_id() != null && vo.getDept_id_1() != null && vo.getDept_id_2() != null && vo.getDept_id_3() == null) { listDept2.add(vo); } else if (vo.getBu_id() != null && vo.getDept_id_1() != null && vo.getDept_id_2() != null && vo.getDept_id_3() != null) { listDept3.add(vo); } } /** * 2.每组排序 */ if (!listBu.isEmpty()) { Collections.sort(listBu); } if (!listDept1.isEmpty()) { Collections.sort(listDept1); } if (!listDept2.isEmpty()) { Collections.sort(listDept2); } if (!listDept3.isEmpty()) { Collections.sort(listDept3); } /** * 3.认亲-认上层节点-追加顺序 */ List<DeptMonitorVo> result2 = sortParentAndSon3(listDept3, listDept2); List<DeptMonitorVo> result1 = sortParentAndSon2(result2, listDept1); List<DeptMonitorVo> result0 = sortParentAndSon1(result1, listBu); return result0; } /** * 两层排序,然后返回父亲列表 * * @param sonList * @param parentList */ private static List<DeptMonitorVo> sortParentAndSon3(List<DeptMonitorVo> sonList, List<DeptMonitorVo> parentList) { if (sonList.isEmpty()) { return parentList; } List<DeptMonitorVo> result = new ArrayList<>(); for (DeptMonitorVo parentVo : parentList) { // 1. 先加入父亲 result.add(parentVo); long dept2 = parentVo.getDept_id_2().longValue(); // 2. 再便利子节点中的符合项, 加入 for (DeptMonitorVo sonVo : sonList) { long sonDept2 = sonVo.getDept_id_2().longValue(); if (dept2 == sonDept2) { result.add(sonVo); } } } return result; } /** * 两层排序,然后返回父亲列表 * * @param sonList * @param parentList */ private static List<DeptMonitorVo> sortParentAndSon2(List<DeptMonitorVo> sonList, List<DeptMonitorVo> parentList) { if (sonList.isEmpty()) { return parentList; } List<DeptMonitorVo> result = new ArrayList<>(); for (DeptMonitorVo parentVo : parentList) { result.add(parentVo); // 1. 先加入父亲 long dept1 = parentVo.getDept_id_1().longValue(); for (DeptMonitorVo sonVo : sonList) { // 2. 再便利子节点中的符合项, 加入 long sonDept1 = sonVo.getDept_id_1().longValue(); if (dept1 == sonDept1) { result.add(sonVo); } } } return result; } /** * 两层排序,然后返回父亲列表 * * @param sonList * @param parentList */ private static List<DeptMonitorVo> sortParentAndSon1(List<DeptMonitorVo> sonList, List<DeptMonitorVo> parentList) { if (sonList.isEmpty()) { return parentList; } List<DeptMonitorVo> result = new ArrayList<>(); for (DeptMonitorVo parentVo : parentList) { // 1. 先加入父亲 result.add(parentVo); long dept0 = parentVo.getBu_id().longValue(); // 2. 再便利子节点中的符合项, 加入 for (DeptMonitorVo sonVo : sonList) { long sonDept0 = sonVo.getBu_id().longValue(); if (dept0 == sonDept0) { result.add(sonVo); } } } return result; } public static void main(String[] args) { String voListString = "[{\"dept_name\":\"3D周边CX部\",\"country_all_day\":1.0,\"bj\":1.0,\"sh\":1.0,\"gz\":1.0,\"cd\":1.0,\"wh\":1.0,\"sy\":1.0,\"xa\":1.0,\"ga\":1.0,\"hz\":1.0,\"bu_id\":2420,\"dept_id_1\":1324,\"dept_id_2\":1334},{\"dept_name\":\"ZNSMCX部\",\"country_all_day\":0.96163,\"bj\":0.9632,\"sh\":0.9677,\"gz\":0.94996,\"cd\":0.96186,\"wh\":0.96438,\"sy\":0.963,\"xa\":0.96552,\"ga\":0.96366,\"hz\":0.97454,\"bu_id\":2420,\"dept_id_1\":1324,\"dept_id_2\":1333},{\"dept_name\":\"SMYYCX部\",\"country_all_day\":0.93846,\"bj\":0.94308,\"sh\":0.94065,\"gz\":0.93518,\"cd\":0.94158,\"wh\":0.92635,\"sy\":0.9362,\"xa\":0.94435,\"ga\":0.93955,\"hz\":0.95217,\"bu_id\":2420,\"dept_id_1\":1324,\"dept_id_2\":1332},{\"dept_name\":\"SM业务部\",\"country_all_day\":0.93419,\"bj\":0.94633,\"sh\":0.94231,\"gz\":0.93303,\"cd\":0.92651,\"wh\":0.91655,\"sy\":0.91778,\"xa\":0.92837,\"ga\":0.93629,\"hz\":0.95856,\"bu_id\":2420,\"dept_id_1\":1324},{\"dept_name\":\"SMPOP及配件CX部\",\"country_all_day\":0.93051,\"bj\":0.9493,\"sh\":0.93414,\"gz\":0.92707,\"cd\":0.92507,\"wh\":0.91526,\"sy\":0.91529,\"xa\":0.93691,\"ga\":0.92456,\"hz\":0.95797,\"bu_id\":2420,\"dept_id_1\":1324,\"dept_id_2\":1335},{\"dept_name\":\"平板CX部\",\"country_all_day\":0.90506,\"bj\":0.91987,\"sh\":0.92736,\"gz\":0.92255,\"cd\":0.87691,\"wh\":0.86422,\"sy\":0.85504,\"xa\":0.85542,\"ga\":0.91938,\"hz\":0.94745,\"bu_id\":2420,\"dept_id_1\":1324,\"dept_id_2\":1776},{\"dept_name\":\"电子书\",\"country_all_day\":1.0,\"bj\":1.0,\"sh\":1.0,\"gz\":1.0,\"cd\":1.0,\"wh\":1.0,\"sy\":1.0,\"xa\":1.0,\"bu_id\":2420,\"dept_id_1\":31,\"dept_id_2\":43},{\"dept_name\":\"自营图书CX部\",\"country_all_day\":0.96973,\"bj\":0.9522,\"sh\":0.97175,\"gz\":0.97694,\"cd\":0.977,\"wh\":0.97683,\"sy\":0.97297,\"xa\":0.97296,\"bu_id\":2420,\"dept_id_1\":31,\"dept_id_2\":41},{\"dept_name\":\"图书音像YW部\",\"country_all_day\":0.968,\"bj\":0.95127,\"sh\":0.97,\"gz\":0.97537,\"cd\":0.97542,\"wh\":0.97583,\"sy\":0.96917,\"xa\":0.96876,\"bu_id\":2420,\"dept_id_1\":31},{\"dept_name\":\"音像CX部\",\"country_all_day\":0.89063,\"bj\":0.90068,\"sh\":0.8967,\"gz\":0.91775,\"cd\":0.91461,\"wh\":0.92825,\"sy\":0.77064,\"xa\":0.70671,\"bu_id\":2420,\"dept_id_1\":31,\"dept_id_2\":42},{\"dept_name\":\"办公CX部\",\"country_all_day\":0.95925,\"bj\":0.97993,\"sh\":0.95771,\"gz\":0.95925,\"cd\":0.95966,\"wh\":0.95505,\"sy\":0.95023,\"xa\":0.95304,\"ga\":0.94573,\"hz\":0.96364,\"bu_id\":2420,\"dept_id_1\":30,\"dept_id_2\":39},{\"dept_name\":\"外设CX部\",\"country_all_day\":0.94805,\"bj\":0.95503,\"sh\":0.94445,\"gz\":0.94828,\"cd\":0.94679,\"wh\":0.93955,\"sy\":0.94585,\"xa\":0.94658,\"ga\":0.95417,\"hz\":0.95216,\"bu_id\":2420,\"dept_id_1\":30,\"dept_id_2\":40},{\"dept_name\":\"电脑配件CX部\",\"country_all_day\":0.93659,\"bj\":0.9486,\"sh\":0.93087,\"gz\":0.92917,\"cd\":0.94604,\"wh\":0.94384,\"sy\":0.93015,\"xa\":0.93837,\"ga\":0.93589,\"hz\":0.94406,\"bu_id\":2420,\"dept_id_1\":30,\"dept_id_2\":336},{\"dept_name\":\"电脑办公业务部\",\"country_all_day\":0.91942,\"bj\":0.94834,\"sh\":0.91891,\"gz\":0.90477,\"cd\":0.91616,\"wh\":0.89693,\"sy\":0.92615,\"xa\":0.92688,\"ga\":0.93079,\"hz\":0.92965,\"bu_id\":2420,\"dept_id_1\":30},{\"dept_name\":\"整机CX部\",\"country_all_day\":0.85047,\"bj\":0.91414,\"sh\":0.85749,\"gz\":0.81637,\"cd\":0.83107,\"wh\":0.79688,\"sy\":0.87217,\"xa\":0.87578,\"ga\":0.88881,\"hz\":0.87836,\"bu_id\":2420,\"dept_id_1\":30,\"dept_id_2\":37},{\"dept_name\":\"直供业务部\",\"country_all_day\":0.84758,\"bj\":0.83333,\"sh\":0.84127,\"gz\":0.80693,\"cd\":0.94118,\"wh\":0.87619,\"sy\":0.89474,\"xa\":0.72727,\"ga\":0.89209,\"hz\":0.66667,\"bu_id\":2420,\"dept_id_1\":1,\"dept_id_2\":1553},{\"dept_name\":\"通讯业务二部\",\"country_all_day\":0.76592,\"bj\":0.77973,\"sh\":0.74857,\"gz\":0.75667,\"cd\":0.77958,\"wh\":0.76166,\"sy\":0.7784,\"xa\":0.77247,\"ga\":0.77877,\"hz\":0.76151,\"bu_id\":2420,\"dept_id_1\":1,\"dept_id_2\":738},{\"dept_name\":\"TX业务部\",\"country_all_day\":0.65548,\"bj\":0.64468,\"sh\":0.62067,\"gz\":0.67024,\"cd\":0.67957,\"wh\":0.6631,\"sy\":0.65866,\"xa\":0.66686,\"ga\":0.65447,\"hz\":0.62753,\"bu_id\":2420,\"dept_id_1\":1},{\"dept_name\":\"运营商业务部\",\"country_all_day\":0.55414,\"bj\":0.52975,\"sh\":0.55859,\"gz\":0.53727,\"cd\":0.69676,\"wh\":0.50726,\"sy\":0.51485,\"xa\":0.56237,\"ga\":0.51848,\"hz\":0.55759,\"bu_id\":2420,\"dept_id_1\":1,\"dept_id_2\":1524},{\"dept_name\":\"通讯业务一部\",\"country_all_day\":0.54539,\"bj\":0.52234,\"sh\":0.50463,\"gz\":0.57716,\"cd\":0.57954,\"wh\":0.56136,\"sy\":0.54289,\"xa\":0.55968,\"ga\":0.52331,\"hz\":0.51473,\"bu_id\":2420,\"dept_id_1\":1,\"dept_id_2\":727},{\"dept_name\":\"2D事业部\",\"country_all_day\":0.82657,\"bj\":0.84881,\"sh\":0.82391,\"gz\":0.81995,\"cd\":0.83711,\"wh\":0.81759,\"sy\":0.83341,\"xa\":0.83206,\"ga\":0.81426,\"hz\":0.82026,\"bu_id\":2420}]"; List<DeptMonitorStoreVo> result = new Gson().fromJson(voListString, new TypeToken<List<DeptMonitorStoreVo>>() { }.getType()); List<? extends DeptMonitorVo> result0 = SortUtil.sortAllDeptLevelList(result); System.out.println(new Gson().toJson(result0)); } }
相关推荐
若需要自定义排序规则,可以传递一个比较器`Comparison<T>`或`IComparer<T>`实例。 4. 分割与合并:`List<T>.Split()`可以将列表分割成多个子列表,而`List.AddRange(IEnumerable)`可以合并多个列表。 5. 查找与替换...
除了STL提供的容器外,开发者可以根据需求自定义泛型容器,通过继承和模板元编程技术实现更具体的功能。 总结,泛型容器在C++编程中扮演着至关重要的角色,它们提供了高效、灵活的数据管理方式。理解并熟练运用泛型...
Java编程语言是软件开发领域广泛使用的工具,尤其在企业级应用和服务器端编程中占据重要地位。本压缩包包含的资源旨在提供全面的Java基础知识,包括算法、JDBC(Java数据库连接)以及多线程和泛型等核心概念。下面...
Java 三级考试是针对Java开发者的一项高级能力评估,旨在测试考生在Java开发、设计和优化方面的深入理解。这个“java 高级考试资料 开发 培训课程”压缩包很可能是为准备这类考试的人提供的资源,包含了重要的学习...
高级学习内容可能会包括自定义排序比较器、稳定排序算法的实现细节以及性能分析。 5. 多线程 Java提供了丰富的线程模型支持,允许开发者执行多任务并行处理。进阶书籍会深入探讨并发编程的概念,如线程生命周期、...
对于自定义类型,用户需要手动实现这三个方法以满足排序需求。 现在,假设`first-class support for sorting slices`提案的目标是简化这个过程。可能的实现方式包括: 1. **内建排序函数**:为特定类型的切片(如...
《Java2实用教程(第三版)》是一本深入浅出的Java编程教材,其课后习题涵盖了Java语言的基础知识到高级特性的广泛内容。这本书旨在帮助初学者和有一定经验的程序员巩固Java编程技能,提升问题解决能力。下面将详细...
TreeSet是一个基于红黑树的NavigableSet实现,它保证了元素的自然排序,或者在创建时可以提供自定义的Comparator。在Java集合框架中,TreeSet经常用于自动排序的集合数据,确保元素按顺序存储。注意,TreeSet不允许...
- **泛型方法**:了解如何定义泛型方法,并使用它们来提高代码的灵活性。 #### 3.3 枚举 - **枚举的定义**:介绍如何定义枚举,并理解枚举与常量的区别。 - **枚举的使用**:学习如何在程序中使用枚举。 #### 3.4...
- **泛型方法**:在方法级别上应用泛型,可以在不改变类的设计的情况下增加方法的功能性。 ##### 4. 集合框架 集合框架是Java标准库中的一个重要组成部分,提供了各种容器类用于存储和管理对象集合。书中全面介绍...
《Java高级开发-架构面试宝典Beta10最新版》是一部专为Java开发者和架构师准备的面试指南,旨在帮助他们提升对Java技术栈的深入理解,并为面试做好充分准备。该资料集聚焦于Java的核心概念、高级特性、设计模式以及...
- 泛型方法:掌握如何定义和使用泛型方法。 - 泛型通配符:理解、extends和super的用法,以及它们在类型推断中的作用。 11. 集合框架 - List、Set和Map接口:了解这些基本集合接口的特性,以及它们之间的区别。 ...
- Collections类:常用方法,如排序、反转。 5. **内存管理** - 堆栈内存与方法区的区别。 - 内存泄漏的概念,如何避免。 - finalize()方法的作用,垃圾回收机制。 6. **多线程** - 创建线程的三种方式:继承...
2.1.3泛型方法 2.2泛型与集合类型 2.2.1 避免隐式的装箱和拆箱 2.2.2编译时的类型安全 2.2.3使用泛型的一个小技巧 2.3本章小结 第3章C#中的委托和事件 3.1理解委托 3.1.1 将方法作为方法的参数 3.1.2将方法...
1. 泛型:学习泛型的概念,了解如何创建泛型类、泛型方法,以及泛型接口和泛型委托。 2. 枚举与结构体:理解枚举类型的应用场景,以及结构体与类的区别,特别是它们在内存分配上的差异。 3. 集合框架:熟悉...
自定义泛型类或泛型方法,可以使用尖括号`<>`指定类型参数,如`class MyClass<T>`。 #### 九、泛型接口 泛型接口类似于泛型类,允许接口中的方法具有类型参数。 #### 十、泛型的通配符 泛型通配符`?`代表未知...
8.4.4 泛型方法与方法重载 309 8.5 擦除和转换 310 8.6 泛型与数组 311 8.7 本章小结 313 第9章 与运行环境交互 314 9.1 与用户互动 315 9.1.1 运行Java程序的参数 315 9.1.2 使用Scanner获取键盘输入 316 ...
源代码展示了如何高效地操作这些集合,包括泛型的使用、迭代器的遍历、集合的排序与比较。 3. 输入/输出(I/O):Java的I/O流系统是其强大功能的一部分,涵盖了字符流、字节流、对象序列化等。源码中包含了文件读写、...