倒排Tree树
倒排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树的更多相关文章
- Lucene 4.X 倒排索引原理与实现: (2) 倒排表的格式设计
1. 定长编码 最容易想到的方式就是常用的普通二进制编码,每个数值占用的长度相同,都占用最大的数值所占用的位数,如图所示. 这里有一个文档ID列表,254,507,756,1007,如果按照二进制定长 ...
- AC日记——单词倒排 1.7 28
28:单词倒排 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔. 输 ...
- OpenJudge计算概论-单词倒排【把句子内单词的顺序翻转】
/*================================================== 单词倒排 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序,读入一段英文 ...
- Tree( 树) 组件[4]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...
- Tree( 树) 组件[3]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 事件列表很多事件的回调函数都包含'node'参数, ...
- Tree( 树) 组件[2]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 异步加载如果想从数据库里获取导航内容, 那么就必须 ...
- Tree( 树) 组件[1]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...
- Python 单词字母顺序不变且所有倒排
翻出google測试project师的一道题目: 设计一个函数,不论什么语言都能够,实现下面功能: 一个句子,将句子中的单词所有倒排过来,但单词的字母顺序不变.eg. this is a real ...
- JQuery Easy Ui (Tree树)详解(转)
第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...
- hdu5044 Tree 树链拆分,点细分,刚,非递归版本
hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...
随机推荐
- Springboot一些常用注解
Springboot启动注解 @SpringbootApplication 这个注解是Springboot最核心的注解,用在Springboot的主类上,标识这是一个Springboot应用,用来开启 ...
- 【LeetCode动态规划#10】完全背包问题实战,其三(单词拆分,涉及集合处理字符串)
单词拆分 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆 ...
- NLP入门1——李宏毅网课笔记
近日因为项目需要,开始恶补预习NLP的相关知识.以前也看过两本相关书籍,但是都十分浅显.这次准备详细的学一下并记录. 李宏毅老师的网课是 Deep Learning for Human Languag ...
- 魔王语言问题c语言实现及思路求解
文章目录 问题描述及需求分析 需求分析 问题分析及实现路线(队列+栈) 结构体核心代码 队列核心代码 入队 出队 栈的核心代码 入栈 出栈 全部代码 单向循环队列和栈(改变B的对应密码) 总结 问题描 ...
- 【易车网实例】x-sign逆向保姆级教程
易车号x-sign逆向 前言 许多网站都有反爬机制,x-sign加密就是许多反爬虫机制的其中一种,本次将以易车号作为目标进行演示. 方法仅供学习参考. 链接:https://hao.yiche.com ...
- Django transaction.atomic 事务的使用
函数 transaction.atomic 数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作. 遇到并发的时候常常会因为接口的访问顺序或者其他情况,导致 ...
- 2020-01-26:mysql8.0做了什么改进?
福哥答案2020-01-26: [2020-01-26:mysql8.0做了什么改进?](http://bbs.xiangxueketang.cn/question/1244)帐户管理增加了对角色的支 ...
- Django4全栈进阶之路12 render 函数和 redirect 函数
在 Django 中,你可以使用 render 函数来渲染模板并将其返回给客户端,也可以使用 redirect 函数来重定向到其他 URL. 在 Django 中,render 函数和 redirec ...
- vue全家桶进阶之路6:Vue的安装以及js引入
1.安装 注意:Vue 不支持 IE8 及以下版本 创建一个文件夹用于下载引入Vue D:\BaiduSyncdisk\vue2 按照最新版本的Vue npm install vue 创建完成后便可以 ...
- Django 与 Vue 语法冲突问题完美解决方法
Django 与 Vue 语法冲突问题完美解决方法 当我们在 django web 框架中,使用 vue 的时候,会遇到语法冲突. 因为 vue 使用 {{}}, 而 django 也使用 {{}}, ...