这是我的论坛某一篇回复。虽然与楼主要求不一致,但这种结构在实际开发中很常见,比较有代表意义,因此收入博客。
原问题是这样的
有一字符串,格式为
1,2@1,3@1,7@2@1,5@1,12@9@1,16@10@5@1
上面字符串每个逗号分隔开的单独部分都是一颗树形结构的层级关系表示。比如说5@1是说自己的节点id为5,父级节点id为1.其他类似。
问题是,怎么根据上面一个字符串构建出该字符串对应的tree来。
由此题扩展,回想起我3年前开发过的一个报表功能
该种报表是为了统计各部门盈利状况。其中各个部门之间有从属关系,类似于原题中的2@1;每个叶子部门在数据库中会有当月收入多少,支出多少这样的字段;然后统计出树状报表;来判断该酒店当月盈利亏损与否,与盈利亏损额多少。当时开发的时候采用的从叶子节点递推到根节点的方式。
与上面的报表应用场景不同的是,我如下的递归算法在MENU多级展开上有一定的适用性。总之思路类似。
package test;
import java.util.HashSet;
import java.util.Set;
public class Node {
public Node parent;
public String value;
public Set<Node> childs = new HashSet<Node>();
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
@Override
public String toString() {
return "Node [childs=" + childs + ", parent=" + parent + ", value="
+ value + "]";
}
}
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Main {
public Node root;
private List<Node> nodes = new ArrayList<Node>();
public void init(String str) {
String[] strs = str.split(",");
for (int i = 0; i < strs.length; i++) {
int index = strs[i].indexOf("@");
if (index == -1) {
root = new Node();
root.value = strs[i];
nodes.add(root);
} else {
String[] ns = strs[i].split("@");
for (int j = 0; j < ns.length; j++) {
Node node = new Node();
node.value = ns[j];
if (!nodes.contains(node)) {
nodes.add(node);
}
}
create(Arrays.asList(ns), 0);
}
}
print(root, "");
}
public void print(Node node, String str) {
System.out.println(str + node.value);
for (Iterator<Node> iterator = node.childs.iterator(); iterator
.hasNext();) {
Node child = iterator.next();
print(child, leftPad(str));
}
}
public String leftPad(String str) {
return "--" + str;
}
public Node create(List<String> list, int index) {
Node node = null;
if (index < list.size()) {
node = getNodeByStr(list.get(index));
if (node.parent == null) {
node.parent = create(list, ++index);
}
if (node.parent != null) {
node.parent.childs.add(node);
}
}
return node;
}
public Node getNodeByStr(String str) {
for (int i = 0; i < nodes.size(); i++) {
Node node = nodes.get(i);
if (node.value.equals(str)) {
return node;
}
}
throw new RuntimeException("not such node " + str);
}
public static void main(String[] args) {
String str = "1,2@1,3@1,7@2@1,5@1,12@9@1,16@10@5@1";
new Main().init(str);
}
}
分享到:
相关推荐
基于改进灰狼优化算法的机械臂轨迹规划:时间最优的353多项式规划算法,机械臂轨迹规划算法,基于改进灰狼加353多项式的机械臂轨迹规划时间最优算法。 改进灰狼改进的灰狼优化算法(CGWO),该算法采用基于余弦规律变化...
带时间窗的遗传算法改进版:局部最优搜索提升配送路径优化效率,matlab实现,可灵活调整坐标,带时间窗的遗传算法改进版:局部最优搜索提升配送路径优化...,时间窗改进遗传算法:添加大规模领域搜索的配送路径优化方法
神经网络数据预测:基于最优广义回归模型与DBO优化算法的自动平滑因子调整及全局最优权重预测原理,神经网络预测之最优广义回归与自动优化模型——基于最新DBO算法嵌套及参数预测原理。,最优广义回归神经网络数据预测...
基于TAC程序的强化学习:自适应最优静态控制算法在线性随机系统中的应用研究,标题:基于TAC程序的强化学习:线性随机系统自适应最优静态控制算法的研究与应用,TAC程序:线性随机系统自适应最优静态控制的强化学习 ...
RRT Family算法优化与MATLAB实现:全局最优轨迹规划技术,全局最优轨迹规划算法:RRT Family的informed-RRT*及MATLAB编程实践与应用,informed-RRT*(RRT Family)全局最优轨迹规划算法 # 机器人轨迹规划(路径规划) #RRT...
"Matlab实现路径规划与A*算法优化:寻找最优配送方案的方法",matlab 路径规划 a星算法 a*算法 最优配送方案 ,matlab;路径规划;A星算法;最优配送方案,Matlab实现A*算法路径规划与最优配送方案
带时间窗的改进粒子群算法:局部最优搜索与大规模领域搜索优化配送路径的matlab实现,带时间窗的改进粒子群算法,可用于配送路径优化,改进点:添加了一个局部最优搜索--大规模领域搜索算法,收敛度更高,算法的结果更...
"遗传算法优化与动态窗口法融合:全局最优路径规划与动态环境适应策略",遗传算法(GA)优化与动态窗口法dwa融合,效果极佳,算法新颖。 -------------------------------------- 全局规划阶段,确定问题的优化目标...
利用动态规划算法进行PHEV的能量优化,以电池SOC、电池功率、发动机功率等因素作为约束条件,建立(贝尔曼方程,也就是动态规划方程)最优成本函数。 目标文件为Python脚本,有详细的注释说明。 此外还包含DP算法的...
改进PSO算法模版:集成约束优化问题的高效解决方案,改进的带约束粒子群算法(IPSO)的MATLAB代码模版:全局最优收敛与多约束问题处理的解决方案,改进的带约束粒子群算法(improved PSO)代码模版 . 会议交讲解; . ...
基于LQR控制的主动前轮转向车辆稳定性控制及ESC系统优化研究报告:离散最优反馈增益算法的实践与应用,基于LQR控制算法的主动前轮转向车辆稳定性控制与优化策略研究(自制Matlab代码、Simulink模型及详细资料),基于...
遗传算法与动态窗口法DWA融合优化:全局路径规划与动态环境适应的算法创新,遗传算法优化与动态窗口法融合:全局最优路径规划与动态环境适应策略,遗传算法(GA)优化与动态窗口法dwa融合,效果极佳,算法新颖。...
机械臂轨迹规划算法的优化研究:基于鲸鱼算法的353多项式时间最优解法与改进对比分析的Matlab源码实现,机械臂轨迹规划算法的优化研究:基于鲸鱼算法的353多项式时间最优解法与两种优化算法的对比分析——附带约束...
典型路况下无人驾驶车辆局部路径规划算法:基于RRT算法与B样条拟合的智能轨迹规划及剪枝技术,典型路况下无人驾驶车辆局部路径规划算法详解:基于RRT算法最优轨迹规划,结合地图修改与B样条拟合技术,最终实现轨迹...
粒子群轨迹规划研究:基于多项式时间最优算法的精准轨迹设计与代码复现,粒子群轨迹规划揭秘:多项式时间最优轨迹规划方法及代码复现指南,粒子群轨迹规划,3-5-3多项式时间最优轨迹规划,复现文章代码 ,粒子群轨迹...
基于Matlab的储能选址定容程序:蒙特卡洛随机算法优选配置方式,详细注释适合零基础学习,附对应文献参考,基于Matlab的储能选址定容程序:蒙特卡洛随机算法求解,直观标注红点显示最优配置,文献支持,基于matlab的...
在探讨“素数最优算法”这一主题时,我们首先需要理解什么是素数,以及为何寻找素数的方法在计算机科学和数学领域中具有重要意义。素数,即只能被1和自身整除的大于1的自然数,是数论研究的基础元素之一,其特性在...
MATLAB代码:粒子群算法求解 IEEE 33bus最优潮流模型 关键词:粒子群算法 PSO 最优潮流 牛顿迭代 仿真平台:MATLAB 主要内容:这是一个用粒子群来解IEEE 33的最优潮流模型,潮流模型是用牛顿迭代法写的 模型包含了...
传统的启发式算法在全局最优解和求解速度上均无法满足主动配电网运行要求,而基于线性化的最优潮流方法在高阻抗的配电网中适用性也较弱。 基于此,文章建立了基于二阶锥规划(SOCP)的动态最优潮流模型框架,力图将原...
算法:遗传算法 麻雀搜索算法 变分模态分解 VMD 目标:经济性最优 模型:储能系统变寿命模型 算法源程序,可运行 ,MATLAB; 混合储能; 功率分配策略; 容量配置; 风力并网; 遗传算法; 麻雀搜索算法; 变分模态分解VMD;...