倒排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 ...
随机推荐
- PHP创建SqlLite数据表并让ID自增
<?php class MyDB extends SQLite3 { function __construct() { $this->open('test.db'); } } $db = ...
- 【配置教程】撑起月6亿PV开源监控解决方案
上次分享过<一个.Net Core开源监控解决方案,支持Redis.Elasticsearch.SqlServer>,这是Stack Overflow 开源的监控产品,基于.Net Cor ...
- java设计模式【抽象工厂模式】
java设计模式[抽象工厂模式] 抽象工厂模式 抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类.在这个模式中,我们只关心产品的抽象接口,而将 ...
- 2013年蓝桥杯C/C++大学A组省赛真题(颠倒的价牌)
题目描述: 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店. 其标价都是4位数字(即千元不等). 小李为了标价清晰.方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参 ...
- ES5 apply与call详解
虽然es6已经出台了很多简单的方法替代了apply和call,但是还是有很多老大项目使用到了es5的这些方法,所以对于这些方法的掌握是有必要的 先回顾一下官方对apply.call的诠释 apply方 ...
- nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx.conf:50
最近在nginx中配置一个443端口 一.安装nginx 首先得先安装个nginx 1.安装依赖包 # 一键安装上面四个依赖 [root@dex ~]# yum -y install gcc zlib ...
- {"status":-1,"statusText":"ERR_CONNECT_FAILED"}
今日使用weex 的stream 遇到一个极坑,也极傻的问题 一.steam.fetch 下面是我使用steam.fetch调用后台接口都截图 二.页面测试 奇怪的是,我借同事是手机来进行测试,有一个 ...
- web自动化07-元素等待
元素等待 1.什么是元素等待? 在定位页面元素时如果没找到,会在指定时间内一直等待的过程 2.为什么需要元素等待 网络速度慢 电脑配置低 服务器处理请求慢 3.三种元素等 ...
- 【python基础】日常知识点整理
[三种方法调用] 1. 类中的方法区分为普通方法(self),静态方法(@staticMenthod),类方法@classMenthod,隐式参数(cls) <1> 普通方法:第一个参数 ...
- 在 Net Core 开发中如何解决 Cannot access a disposed object 这个问题
一.简介 Net Core跨平台项目开发多了,总会遇到各种各样的问题,我就遇到了一个这样的问题,不能访问 Cannot access a disposed object 错误,经过自己多方努力,查阅资 ...