非科班出身,欢迎指正。

要实现的逻辑是,在一棵树中,给出任意一个节点,获取到该节点下的N个层级。

一.树型结构

下图的树中,节点上的字母代表节点的名字,字母下的代表该节点的下单金额。

二.数据准备

组装数据

package ATree;

import java.util.ArrayList;

import java.util.List;

public class PreData {

public static List getData(){

NodeOrder A = new NodeOrder("0", "A","-1","123");

NodeOrder B = new NodeOrder("1", "B","0","10");

NodeOrder C = new NodeOrder("2", "C","0","20");

NodeOrder D = new NodeOrder("3", "D","0","30");

NodeOrder E = new NodeOrder("4", "E","1","40");

NodeOrder F = new NodeOrder("5", "F","3","50");

NodeOrder G = new NodeOrder("6", "G","3","60");

NodeOrder H = new NodeOrder("7", "H","4","70");

NodeOrder I = new NodeOrder("8", "I","4","80");

NodeOrder J = new NodeOrder("9", "J","4","90");

NodeOrder K = new NodeOrder("10","K","6","100");

NodeOrder L = new NodeOrder("11","L","8","110");

NodeOrder M = new NodeOrder("12","M","10","120");

NodeOrder N = new NodeOrder("13","N","10","130");

NodeOrder O = new NodeOrder("14","O","12","140");

NodeOrder P = new NodeOrder("15","P","12","150");

NodeOrder Q = new NodeOrder("16","Q","13","160");

NodeOrder R = new NodeOrder("17","R","13","170");

NodeOrder S = new NodeOrder("18","S","13","180");

NodeOrder T = new NodeOrder("19","T","15","190");

NodeOrder U = new NodeOrder("20","U","15","200");

NodeOrder V = new NodeOrder("21","V","19","210");

NodeOrder W = new NodeOrder("22","W","19","220");

NodeOrder X = new NodeOrder("23","X","20","230");

NodeOrder Y = new NodeOrder("24","Y","20","240");

NodeOrder Z = new NodeOrder("25","Z","20","250");

List list = new ArrayList<>();

list.add(A);

list.add(B);

list.add(C);

list.add(D);

list.add(E);

list.add(F);

list.add(G);

list.add(H);

list.add(I);

list.add(J);

list.add(K);

list.add(L);

list.add(M);

list.add(N);

list.add(O);

list.add(P);

list.add(Q);

list.add(R);

list.add(S);

list.add(T);

list.add(U);

list.add(V);

list.add(W);

list.add(X);

list.add(Y);

list.add(Z);

return list;

}

}

package ATree;

import java.math.BigDecimal;

public class NodeOrder {

private String id;

private String tag;

private String parentId;

private BigDecimal orderAmount;

public NodeOrder(String id, String tag, String parentId, String orderAmount) {

this.id = id;

this.tag = tag;

this.parentId = parentId;

this.orderAmount = new BigDecimal(orderAmount);

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getTag() {

return tag;

}

public void setTag(String tag) {

this.tag = tag;

}

public String getParentId() {

return parentId;

}

public void setParentId(String parentId) {

this.parentId = parentId;

}

public BigDecimal getOrderAmount() {

return orderAmount;

}

public void setOrderAmount(BigDecimal orderAmount) {

this.orderAmount = orderAmount;

}

}

编写逻辑

packageATree;importcom.alibaba.fastjson.JSON;importorg.apache.commons.collections.CollectionUtils;importjava.math.BigDecimal;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;public classTest {//计算层级的最大值

public static final int MAX_LEVEL = 3;public static voidmain(String[] args) {

Test test= newTest();

List list =PreData.getData();

test.start("10",list);

}public void start(String id, Listsources){

Map> parentMap =groupByParentId(sources);

Map> levelMap = new HashMap<>();

getLevel(id, parentMap, levelMap,1);

System.out.println(JSON.toJSONString(levelMap));

}public void getLevel(String parentId,Map> parentMap,Map> levelMap,intcount){//根据parentId获取节点

List nextLevel =parentMap.get(parentId);if(CollectionUtils.isEmpty(nextLevel))return;

String countStr=String.valueOf(count);

List thisLevel =levelMap.get(countStr);if(CollectionUtils.isEmpty(thisLevel)) {

levelMap.put(countStr, nextLevel);

}else{

thisLevel.addAll(nextLevel);

levelMap.put(countStr, thisLevel);

}

count++;if(count >MAX_LEVEL)return;for(NodeOrder nodeOrder : nextLevel) {

String tempParentId=nodeOrder.getId();

getLevel(tempParentId, parentMap, levelMap, count);

}

}//按父节点分组

public Map> groupByParentId(Listsources){

Map> listGroupby =sources.parallelStream().collect(Collectors.groupingBy(NodeOrder::getParentId));returnlistGroupby;

}

}

三.测试

按照图中的树形结构,以K节点举例,遍历得到K节点下的3个层级,输出的字符串为:

{"1":[{"id":"12","orderAmount":120,"parentId":"10","tag":"M"},{"id":"13","orderAmount":130,"parentId":"10","tag":"N"}],"2":[{"id":"14","orderAmount":140,"parentId":"12","tag":"O"},{"id":"15","orderAmount":150,"parentId":"12","tag":"P"},{"id":"16","orderAmount":160,"parentId":"13","tag":"Q"},{"id":"17","orderAmount":170,"parentId":"13","tag":"R"},{"id":"18","orderAmount":180,"parentId":"13","tag":"S"}],"3":[{"id":"19","orderAmount":190,"parentId":"15","tag":"T"},{"id":"20","orderAmount":200,"parentId":"15","tag":"U"}]}

JSON结构为:

1 {2 "1": [3 {4 "id": "12",5 "orderAmount": 120,6 "parentId": "10",7 "tag": "M"

8 },9 {10 "id": "13",11 "orderAmount": 130,12 "parentId": "10",13 "tag": "N"

14 }15 ],16 "2": [17 {18 "id": "14",19 "orderAmount": 140,20 "parentId": "12",21 "tag": "O"

22 },23 {24 "id": "15",25 "orderAmount": 150,26 "parentId": "12",27 "tag": "P"

28 },29 {30 "id": "16",31 "orderAmount": 160,32 "parentId": "13",33 "tag": "Q"

34 },35 {36 "id": "17",37 "orderAmount": 170,38 "parentId": "13",39 "tag": "R"

40 },41 {42 "id": "18",43 "orderAmount": 180,44 "parentId": "13",45 "tag": "S"

46 }47 ],48 "3": [49 {50 "id": "19",51 "orderAmount": 190,52 "parentId": "15",53 "tag": "T"

54 },55 {56 "id": "20",57 "orderAmount": 200,58 "parentId": "15",59 "tag": "U"

60 }61 ]62 }

java 树的层次遍历_Java遍历树的层级 - osc_jegm3yg5的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java有没有回调函数_Java中的回调函数 - wangjianme的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充. 它的最主要特点是即定义了调用的规范同时又非常的灵活. 回调函数有些类似于观察者模式,它们的区别在于:观察者模式返回的参数为Event ...

  2. java实现gdal栅格矢量化_gdal栅格矢量化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...

    #include "gdal_alg.h" 栅格矢量化功能用于将栅格数据生成矢量数据,通常用于分类图像.GDAL库中使用函数GDALPolygonize()或者函数GDALFPol ...

  3. 最新JAVA性能调优实战教程_java性能调优实战 - osc_9z8xc00s的个人空间 - OSCHINA - 中文开源技术交流社区...

    在项目压测过程中,发现系统占用,上下文切换非常频繁,在此记录下调优过程,希望对后来人有所帮助. 测试方法:模拟客户端实际操作,向服务器高并发发送数据,查看服务器的负载情况. 服务器基本配置如下 1,基 ...

  4. java痴和堆_JAVA虚拟机理解 - 爱笑的痴迷者的个人空间 - OSCHINA - 中文开源技术交流社区...

    JVM定义: JVM(Java Virtual Machine),是一种运行Java程序的软件实现,是虚拟的机器.Java程序与平台无关,它直接在虚拟机中运行. JVM运行过程: JVM将内存分划如下 ...

  5. java代餐计算器_java入门7 - 千言sully的个人空间 - OSCHINA - 中文开源技术交流社区...

    1...访问修饰符   返回值类型  方法名(参数列表){} 访问修饰符:方法允许访问的权限范围 返回值类型:void是不带return返回值的,   如果带返回值,此时要把返回值类型写出来 方法名( ...

  6. java 车站分级_做题中的错误总结 - osc_p4wgjz7p的个人空间 - OSCHINA - 中文开源技术交流社区...

    马上NOIP2018啦,突然发现自己比去年还菜,写水题时出现了很多错误,记录一下. 2018.7.8 luoguP2016 战略游戏 节点从0编号. 所以以i为根时不能设i的根为0,应设为-1 for ...

  7. java选择排序不稳定_选择排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...

    选择排序就这么简单 从上一篇已经讲解了冒泡排序了,本章主要讲解的是选择排序,希望大家看完能够理解并手写出选择排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出. 选择排序介绍和稳 ...

  8. Java做诗_搞IT,抽空写写诗 - mellen的个人空间 - OSCHINA - 中文开源技术交流社区...

    搞IT也可换换思路. 下面献丑一个本人的诗 <很长很长的一朵朵> -------(比较长)-------- 雨随着月夜纷飞, 错过的是树下的积水 眼前熟悉的影像, 却忽然变得很陌生, 心深 ...

  9. java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...

    算法解题思路: 细读算法要求 找到极限情况 找到临界情况,结果依赖 找到最终的结束求解点 编程实现:考虑算法的空间复杂度和时间复杂度 案例说明: 假设: 输入字符串为:s, 长度为:slen, s的第 ...

最新文章

  1. java动态加载配置文件
  2. 禁止直接在浏览器输入网址访问的代码
  3. asp.net控件库FineUI使用入门图解
  4. Impala性能优化
  5. 局部图像描述子——Harris角点检测器
  6. 阿里云服务器 搭建单体redis 以及踩坑
  7. 阿里宣布取消的周报又死灰复燃?3分钟的高效报表才是最后出路
  8. (20)Xilinx PCIE中断调试成功(学无止境)
  9. 【80万年薪】2019 互联网校招薪酬曝光,看你能拿到多少钱!
  10. java面向对象计算机与CD实验,Java面向对象上机实验指导书.doc
  11. 最短路最小生成树水题
  12. JavaScript设计模式入坑 1
  13. C#自学总结_Day2
  14. ppc+安装编译mysql_redhat7ppc安装
  15. XMPP即时通讯协议使用(前传)——协议详解
  16. Spark实现jieba中文分词(scala)
  17. 如何用计算机算十进制,计算器怎么,计算机是怎么转换二进制为十进制的
  18. python 利用matploylib画动态雷达实时显示图
  19. HDLBITS 练习 卡诺图化简部分
  20. Python词云_自定义图片做背景

热门文章

  1. CSS选择器的声明与嵌套
  2. python selenium框架_基于python+selenium的框架思路
  3. oracle层次查询中prior与自上而下、自下而上查询
  4. python入门基础系列_Python3基础系列-基本入门语法
  5. 关于排序速度效率数组集合选择那点事
  6. C语言程序流程设计之循环【程序流程设计】(13)
  7. 10的预览模式_谷歌相机2020年3月更新汇总,适配米10等五摄手机,30s手动曝光
  8. 阿里云徐立:面向容器和 Serverless Computing 的存储创新
  9. 阿里云故障演练平台获得可信云最高等级认证,为企业数字韧性能力保驾护航
  10. Kubernetes 弹性伸缩全场景解读(二)- HPA 的原理与演进