倒排Tree树

需求说明为:

​ 树节点存在(标识)或者叶子节点存在标识 都需要展示出来 存在※的节点及其上级节点需要返回 其余节点需要剔除

​ A() -------------------------------------------------------------------根节点

​ A1.1(), A1.2()---------------------------------------------------------一级节点

​ A1.1.1() ,A1.1.2() , A1.1.3(※) A1.2.1() -------------------------------------------------------二级节点

A1.1.1.1(※) A1.1.2.1() A1.1.2.2() A1.2.1.1() A1.2.1.2(※) -------------------------------------三级节点

此时如上的话 需要展示的结果为: 其余节点不需要

A --> A1.1

​ -->A1.1.3

​ -->A1.1.1

​ -->A1.1.1.1

​ -->A1.2

​ -->A1.2.1

​ -->A1.2.1.2

解决方案:

public static void main(String[] args) {
List<TreeNode> allDataCollection = // 取出所有节点
List<TreeNode> markCollection = // 带有 ※ 标识的节点
desertAspenConstruction(allDataCollection, markCollection);
List<TreeNode> resTreeNodes = createResult(allDataCollection, false);
resTreeNodes.forEach(System.out::println);
}
public static List<TreeNode> createResult(List<TreeNode> allDataCollection, boolean needSort) {
allDataCollection.forEach(treeNode -> System.out.println("createResult : " + treeNode)); List<TreeNode> resList = new ArrayList<>();
allDataCollection.forEach(treeNode -> {
if (treeNode.getParentId().equals("1") && !treeNode.getIsToKeep().equals("0")) {
resList.add(treeNode);
}
});
if (needSort) Collections.sort(resList, (o1, o2) -> o1.getSn() - o2.getSn() < 0 ? 1 : -1);
return resList;
} /**
* 功能描述: <br> 沙漠白杨建设
* [No modification without permission, at your own risk (*)]
* 〈〉
* [allDataCollection, markCollection]
*
* @return: void
* @since: 1.0.0
*/
public static void desertAspenConstruction(List<TreeNode> allDataCollection, List<TreeNode> markCollection) {
allDataCollection.forEach(treeNode -> {
if (StringXutil.isNullOrBlank(treeNode.parentId)) treeNode.parentId = "1";
if (StringXutil.isNullOrBlank(treeNode.isToKeep)) treeNode.isToKeep = "0";
boolean flag = true;
if (markCollection == null || markCollection.size() == 0 || markCollection.isEmpty()) {
flag = false;
}
if (flag) {
markCollection.forEach(treeNode1 -> {
if (treeNode.getId().equals(treeNode1.getId())) {
treeNode.setIsToKeep("1");
}
});
} else {
treeNode.setIsToKeep("1");
}
});
allDataCollection.forEach(treeNode -> {
basicDataFormattingRecursion(allDataCollection, treeNode);
});
bulidTreeChildren(allDataCollection);
} /**
* 功能描述: <br> 基本数据格式化递归
* [No modification without permission, at your own risk (*)]
* 〈〉
* [allList, treeNode1, flag] [ 全部数据集合 , 随机节点(会遍历所有上级节点) , flag 是否去减掉没有标志的数据() ]
*
* @return: void
* @since: 1.0.0
*/
public static void basicDataFormattingRecursion(List<TreeNode> allDataCollection, TreeNode treeNode1) {
if (treeNode1.getIsToKeep().equals("1") || treeNode1.getIsToKeep().equals("2")) {
allDataCollection.forEach(treeNode -> {
if (treeNode1.getParentId().equals(treeNode.getId())) {
if (StringXutil.isNullOrBlank(treeNode.getIsToKeep())) treeNode.isToKeep = "0";
if (treeNode.getIsToKeep().equals("0")) treeNode.setIsToKeep("2");
if (StringXutil.isNullOrBlank(treeNode.getRemark())) {
treeNode.setRemark(treeNode1.getId() + ",");
} else {
treeNode.setRemark(treeNode.getRemark() + treeNode1.getId() + ",");
}
if (!(treeNode.getParentId()).equals("1"))
basicDataFormattingRecursion(allDataCollection, treeNode);
}
});
}
} /**
* 功能描述: <br> 建造树儿子
* [No modification without permission, at your own risk (*)]
* 〈〉
* [allDataCollection] [全部数据集合]
*
* @return: void
* @since: 1.0.0
*/
public static void bulidTreeChildren(List<TreeNode> allDataCollection) {
allDataCollection.forEach((treeNode) -> {
List<TreeNode> childrenList = new ArrayList<>();
if (!StringXutil.isNullOrBlank(treeNode.getRemark())) {
String[] arr = treeNode.getRemark().split(","); // 1,2,3,4,6,7,8
for (String temp : arr) {
allDataCollection.forEach(treeNode1 -> {
if (treeNode1.getId().equals(temp)) childrenList.add(treeNode1);
});
}
}
removeDuplicate(childrenList);
treeNode.setChildren(childrenList);
});
} public static <T> void removeDuplicate(List<T> list) {
List<T> result = new ArrayList<T>(list.size());
for (T str : list) {
if (!result.contains(str)) {
result.add(str);
}
}
list.clear();
list.addAll(result);
}
@ToString
@Data
public class TreeNode {
protected String id;
protected String parentId;
protected int sn;
protected String name;
protected String remark;
protected String isToKeep;
protected List<TreeNode> children = new ArrayList<TreeNode>(); public void add(TreeNode node) {
children.add(node);
} public String getParentId() {
return StringXutil.isNullOrBlank(parentId) ? "1" : parentId;
} public void setParentId(String parentId) {
this.parentId = StringXutil.isNullOrBlank(parentId) ? "1" : parentId;
}
}

倒排Tree树的更多相关文章

  1. Lucene 4.X 倒排索引原理与实现: (2) 倒排表的格式设计

    1. 定长编码 最容易想到的方式就是常用的普通二进制编码,每个数值占用的长度相同,都占用最大的数值所占用的位数,如图所示. 这里有一个文档ID列表,254,507,756,1007,如果按照二进制定长 ...

  2. AC日记——单词倒排 1.7 28

    28:单词倒排 总时间限制:  1000ms 内存限制:  65536kB 描述 编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔. 输 ...

  3. OpenJudge计算概论-单词倒排【把句子内单词的顺序翻转】

    /*================================================== 单词倒排 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序,读入一段英文 ...

  4. Tree( 树) 组件[4]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...

  5. Tree( 树) 组件[3]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 事件列表很多事件的回调函数都包含'node'参数, ...

  6. Tree( 树) 组件[2]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 异步加载如果想从数据库里获取导航内容, 那么就必须 ...

  7. Tree( 树) 组件[1]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...

  8. Python 单词字母顺序不变且所有倒排

    翻出google測试project师的一道题目: 设计一个函数,不论什么语言都能够,实现下面功能: 一个句子,将句子中的单词所有倒排过来,但单词的字母顺序不变.eg.  this is a real ...

  9. JQuery Easy Ui (Tree树)详解(转)

    第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...

  10. hdu5044 Tree 树链拆分,点细分,刚,非递归版本

    hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...

随机推荐

  1. Linux(二)文件权限和压缩

    1 搜索查找类 1.1 查找定位文件 find <搜索范围.路径> <选项> find将从指定目录下递归地遍历其各个子目录,将满足条件的文件显示在终端. 选项说明 -name: ...

  2. 业务系统对接CAS

    启动类加@EnableCasClient <!--cas客户端--> <dependency> <groupId>net.unicon.cas</groupI ...

  3. flex:1的情况下,overflow:auto没有生效的问题

    flex:1的元素的父元素必须保证高度或者宽度有具体的数值:如果父元素的高度或者宽度也是flex:1自适应的,最好在父元素上也设置overflow:auto,这样子元素的overflow:auto生效 ...

  4. 「微服务」这10道Consul面试题值得一看

    前言 Consul 是一种非常强大的分布式服务发现和配置管理工具,它可以帮助开发人员和运维人员更好地管理和维护分布式系统. 但是,使用 Consul 也需要投入一定的人力和物力,需要根据实际情况进行选 ...

  5. 收藏!最全Linux思维导图

    收藏!最全Linux思维导图 目录 收藏!最全Linux思维导图 1. 认识 Linux 2. Linux 命令 3. Linux学习路径 4. Linux 桌面介绍 5. FHS:文件系统目录标准 ...

  6. percona-server-rocksdb-8.0.32 安装

    MyRocks是关系型数据库Mysql 基于RocksDB 的存储引擎,一个可嵌入的.持久的键值存储.Percona MyRocks 是集于 Percona Server for MySQL的. Ro ...

  7. java线程池和多线程的使用详解

    Java 多线程和线程池使用 java多线程实现的几种方法 1.继承Thread类 继承Thread类,重写run方法,创建线程类对象调用start方法启动线程. public class Threa ...

  8. 2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 。 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。 实现 MajorityChecker 类

    2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 . 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素. 实现 MajorityChecker 类 ...

  9. 2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应,那么一个数字字符串比如"111”就可以转化为:"AAA"、"KA"和"AK"。给定一个只有数字字符组成的字符串str,请问有多少种转化结果?

    2021-02-17:规定1和A对应.2和B对应.3和C对应...26和Z对应,那么一个数字字符串比如"111"就可以转化为:"AAA"."KA&qu ...

  10. 2021-03-05:go中,io密集型的应用,比如有很多文件io,磁盘io,网络io,调大GOMAXPROCS,会不会对性能有帮助?为什么?

    2021-03-05:go中,io密集型的应用,比如有很多文件io,磁盘io,网络io,调大GOMAXPROCS,会不会对性能有帮助?为什么? 福哥答案2021-03-05: 这是面试中被问到的.实力 ...