倒排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 ...
随机推荐
- Atcoder Regular Contest 093 C - Bichrome Spanning Tree
给定一张图,对图上边黑白染色,使得同时选择了两种颜色边的最小生成树边权和为X,求染色方案数. 先求出图的\(mst\)大小,然后分三类讨论: 1.\(X<mst\) 无解 2.\(X==mst\ ...
- 2023年成都.NET线下技术沙龙活动即将到来!
MASA技术团队联合成都.NET俱乐部,将在成都市举办一场.NET线下技术沙龙,为.NET开发者创造一次交流学习的契机,我们邀请到的几位技术大咖,将会围绕各自的主题向大家分享他们的技术心得. 本场沙龙 ...
- DeFi-DEX-借贷
不知道为什么上课的笔记没保存上55555 看看ppt和视频吧(
- 关于Java中对象的向上转型和向下转型
什么是多态? 同一个类调用同一个方法会产生不同的影响/结果 这就是多态 public class Pet{ public void eat(){ System.out.println("Pe ...
- 记一次 Windows10 内存压缩模块 崩溃分析
一:背景 1. 讲故事 在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相 ...
- 【Docker】镜像管理
一.搜索镜像 1.在官方网站搜索镜像 Docker 官方镜像仓库:https://hub.docker.com/ 2.docker search 搜索镜像 Usage: docker search [ ...
- 几种常见的Python数据结构
摘要:本文主要为大家讲解在Python开发中常见的几种数据结构. 本文分享自华为云社区<Python的常见数据结构>,作者: timerring . 数据结构和序列 元组 元组是一个固定长 ...
- dede网站flash中图片不能正常显示解决办法
专业微信开发 网站制作 就在西安格创网络 联系电话:18009249661 原因:因为服务器或虚拟主机用了CDN加速,导致图片是调用远程缓存,只能显示FLASH控件,但图片不能正常显示,常见于西 ...
- 2022-09-04:以下go语言代码输出什么?A:不能编译;B:45;C:45.2;D:45.0。 package main import ( “fmt“ ) func main() {
2022-09-04:以下go语言代码输出什么?A:不能编译:B:45:C:45.2:D:45.0. package main import ( "fmt" ) func main ...
- golang调用sdl2,播放pcm音频,报错signal arrived during external code execution。
golang调用sdl2,播放pcm音频,报错signal arrived during external code execution. win10 x64下测试成功,其他操作系统下不保证成功. 采 ...