【7.6.0】【rule】树形Structure结构构建工具

pull/55/MERGE
fengshuonan 2023-06-15 15:26:50 +08:00
parent 64461f71da
commit 18005d4aa2
3 changed files with 152 additions and 0 deletions

View File

@ -0,0 +1,26 @@
package cn.stylefeng.roses.kernel.rule.constants;
/**
* pid
*
* @author fengshuonan
* @since 2023/6/15 15:00
*/
public class PidBuildConstants {
/**
* id
*/
public static final String TOP_FLAG = "-1";
/**
* ids
*/
public static final String TOP_PIDS = "[-1],";
/**
* pids
*/
public static final String SEPARATOR = SymbolConstant.COMMA;
}

View File

@ -0,0 +1,34 @@
package cn.stylefeng.roses.kernel.rule.tree.buildpids;
/**
* pids
*
* @author fengshuonan
* @since 2023/6/15 15:01
*/
public interface BasePidBuildModel {
/**
* id
*
* @author fengshuonan
* @since 2023/6/15 15:02
*/
String pidBuildNodeId();
/**
* id
*
* @author fengshuonan
* @since 2023/6/15 15:02
*/
String pidBuildParentId();
/**
* pids
*
* @author fengshuonan
* @since 2023/6/15 15:02
*/
void setPidBuildPidStructure(String pids);
}

View File

@ -0,0 +1,92 @@
package cn.stylefeng.roses.kernel.rule.tree.buildpids;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.rule.constants.PidBuildConstants;
import cn.stylefeng.roses.kernel.rule.constants.SymbolConstant;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* pidspids
*
* @author fengshuonan
* @since 2023/6/15 15:02
*/
public class PidStructureBuildUtil {
/**
* pids
*
* @author fengshuonan
* @since 2023/6/15 15:03
*/
public static <T extends BasePidBuildModel> void createPidStructure(List<T> list) {
// 保存每一个数据的pids路径成品key是节点idvalue是pids路径字符串
Map<String, String> routeMap = new HashMap<>();
// 暂时未找到父级的pids的对象key是节点idvalue是实体对象
Map<String, T> waitMap = new HashMap<>();
// 一次遍历
for (T itemModel : list) {
String pid = itemModel.pidBuildParentId();
String pids = "";
// pid不存在或者pid是-1直接设置pids为[-1],
if (ObjectUtil.isEmpty(pid) || PidBuildConstants.TOP_FLAG.equals(pid)) {
pids = PidBuildConstants.TOP_PIDS;
itemModel.setPidBuildPidStructure(pids);
routeMap.put(itemModel.pidBuildNodeId(), pids);
}
// pid存在去routeMap找它的父级的pids【父级的pids,[父级的id],】
else {
String parentPids = routeMap.get(pid);
//如果此时还没处理到它的父级,放入等待队列中,处理完一轮后再回溯
if (ObjectUtil.isEmpty(parentPids)) {
waitMap.put(itemModel.pidBuildNodeId(), itemModel);
} else {
pids = parentPids + SymbolConstant.LEFT_SQUARE_BRACKETS + pid + SymbolConstant.RIGHT_SQUARE_BRACKETS + PidBuildConstants.SEPARATOR;
itemModel.setPidBuildPidStructure(pids);
routeMap.put(itemModel.pidBuildNodeId(), pids);
}
}
}
// 处理暂时未找到父级的pids的对象集合
int size = waitMap.size();
while (size != 0) {
// 处理waitMap中没拿到结果的对象
Iterator<Map.Entry<String, T>> iterator = waitMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, T> entry = iterator.next();
T waitProcessItem = entry.getValue();
// 再次寻找父级的pids
String parentPids = routeMap.get(waitProcessItem.pidBuildParentId());
if (ObjectUtil.isEmpty(parentPids)) {
//如果还是没有,等待下一次回溯
continue;
}
// 父级的pids有了组装自己的pids
String pids = parentPids + SymbolConstant.LEFT_SQUARE_BRACKETS + waitProcessItem.pidBuildParentId() + SymbolConstant.RIGHT_SQUARE_BRACKETS + PidBuildConstants.SEPARATOR;
waitProcessItem.setPidBuildPidStructure(pids);
// 放入map以便它的下级在回溯的时候能够找到它
routeMap.put(waitProcessItem.pidBuildNodeId(), pids);
// 每找到一个,就删除一个
size--;
iterator.remove();
}
}
}
}