`

自定义泛型方法, 三级排序, low版,待升级

    博客分类:
  • Java
 
阅读更多
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));
    }
}

 

0
1
分享到:
评论

相关推荐

    细细品味C#(泛型专题)

    #### 三、C# 泛型秘诀 - **3.2.1 理解泛型** - **泛型的本质**:泛型是一种在编译时确定具体类型的技术,能够提供更好的类型安全性和代码重用性。 - **泛型实例化**:当使用泛型类或方法时,需要指定具体的类型...

    C#重要知识之——泛型列表List例子

    若需要自定义排序规则,可以传递一个比较器`Comparison&lt;T&gt;`或`IComparer&lt;T&gt;`实例。 4. 分割与合并:`List&lt;T&gt;.Split()`可以将列表分割成多个子列表,而`List.AddRange(IEnumerable)`可以合并多个列表。 5. 查找与替换...

    泛型容器(Containers)的應用與實作

    除了STL提供的容器外,开发者可以根据需求自定义泛型容器,通过继承和模板元编程技术实现更具体的功能。 总结,泛型容器在C++编程中扮演着至关重要的角色,它们提供了高效、灵活的数据管理方式。理解并熟练运用泛型...

    内置java算法知识+jdbc知识+基础知识的所有代码,多线程,泛型等等都有

    Java编程语言是软件开发领域广泛使用的工具,尤其在企业级应用和服务器端编程中占据重要地位。本压缩包包含的资源旨在提供全面的Java基础知识,包括算法、JDBC(Java数据库连接)以及多线程和泛型等核心概念。下面...

    java 三级考试3

    Java 三级考试是针对Java开发者的一项高级能力评估,旨在测试考生在Java开发、设计和优化方面的深入理解。这个“java 高级考试资料 开发 培训课程”压缩包很可能是为准备这类考试的人提供的资源,包含了重要的学习...

    java 高级语言编程 进阶版+中文

    高级学习内容可能会包括自定义排序比较器、稳定排序算法的实现细节以及性能分析。 5. 多线程 Java提供了丰富的线程模型支持,允许开发者执行多任务并行处理。进阶书籍会深入探讨并发编程的概念,如线程生命周期、...

    开源项目-golang-go.zip

    对于自定义类型,用户需要手动实现这三个方法以满足排序需求。 现在,假设`first-class support for sorting slices`提案的目标是简化这个过程。可能的实现方式包括: 1. **内建排序函数**:为特定类型的切片(如...

    Java2实用教程(第三版)课后习题参考答案

    《Java2实用教程(第三版)》是一本深入浅出的Java编程教材,其课后习题涵盖了Java语言的基础知识到高级特性的广泛内容。这本书旨在帮助初学者和有一定经验的程序员巩固Java编程技能,提升问题解决能力。下面将详细...

    ocjp题库 1z0-851

    TreeSet是一个基于红黑树的NavigableSet实现,它保证了元素的自然排序,或者在创建时可以提供自定义的Comparator。在Java集合框架中,TreeSet经常用于自动排序的集合数据,确保元素按顺序存储。注意,TreeSet不允许...

    C#高级编程第六版目录

    - **泛型方法**:了解如何定义泛型方法,并使用它们来提高代码的灵活性。 #### 3.3 枚举 - **枚举的定义**:介绍如何定义枚举,并理解枚举与常量的区别。 - **枚举的使用**:学习如何在程序中使用枚举。 #### 3.4...

    Bruce.Eckel.Thinking.In.Java.4th.Edition.Dec.2007.eBook-BBL

    - **泛型方法**:在方法级别上应用泛型,可以在不改变类的设计的情况下增加方法的功能性。 ##### 4. 集合框架 集合框架是Java标准库中的一个重要组成部分,提供了各种容器类用于存储和管理对象集合。书中全面介绍...

    Java高级开发-架构面试宝典Beta10最新版

    《Java高级开发-架构面试宝典Beta10最新版》是一部专为Java开发者和架构师准备的面试指南,旨在帮助他们提升对Java技术栈的深入理解,并为面试做好充分准备。该资料集聚焦于Java的核心概念、高级特性、设计模式以及...

    Think in java 教程

    - 泛型方法:掌握如何定义和使用泛型方法。 - 泛型通配符:理解、extends和super的用法,以及它们在类型推断中的作用。 11. 集合框架 - List、Set和Map接口:了解这些基本集合接口的特性,以及它们之间的区别。 ...

    JAVA笔试题汇总,各人收集的全部笔试题贡献出来啦

    - Collections类:常用方法,如排序、反转。 5. **内存管理** - 堆栈内存与方法区的区别。 - 内存泄漏的概念,如何避免。 - finalize()方法的作用,垃圾回收机制。 6. **多线程** - 创建线程的三种方式:继承...

    .NET之美:.NET关键技术深入分析

    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将方法...

    .net笔试题 C#

    1. 泛型:学习泛型的概念,了解如何创建泛型类、泛型方法,以及泛型接口和泛型委托。 2. 枚举与结构体:理解枚举类型的应用场景,以及结构体与类的区别,特别是它们在内存分配上的差异。 3. 集合框架:熟悉...

    传智播客视频JavaSE学习笔记

    自定义泛型类或泛型方法,可以使用尖括号`&lt;&gt;`指定类型参数,如`class MyClass&lt;T&gt;`。 #### 九、泛型接口 泛型接口类似于泛型类,允许接口中的方法具有类型参数。 #### 十、泛型的通配符 泛型通配符`?`代表未知...

    疯狂JAVA讲义

    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 ...

    Core Java 2(第七版)第二卷源代码

    源代码展示了如何高效地操作这些集合,包括泛型的使用、迭代器的遍历、集合的排序与比较。 3. 输入/输出(I/O):Java的I/O流系统是其强大功能的一部分,涵盖了字符流、字节流、对象序列化等。源码中包含了文件读写、...

Global site tag (gtag.js) - Google Analytics