这是我的论坛某一篇回复。虽然与楼主要求不一致,但这种结构在实际开发中很常见,比较有代表意义,因此收入博客。
原问题是这样的
有一字符串,格式为
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);
}
}
分享到:
相关推荐
带时间窗的遗传算法改进版:局部最优搜索提升配送路径优化效率,matlab实现,可灵活调整坐标,带时间窗的遗传算法改进版:局部最优搜索提升配送路径优化...,时间窗改进遗传算法:添加大规模领域搜索的配送路径优化方法
神经网络数据预测:基于最优广义回归模型与DBO优化算法的自动平滑因子调整及全局最优权重预测原理,神经网络预测之最优广义回归与自动优化模型——基于最新DBO算法嵌套及参数预测原理。,最优广义回归神经网络数据预测...
改进灰狼优化算法(CGWO)与353多项式结合的机械臂轨迹规划时间最优算法,正是在这样的背景下应运而生,致力于解决机械臂在执行任务过程中的路径和时间优化问题。 改进的灰狼优化算法(CGWO)是一种智能优化算法,...
带时间窗的改进粒子群算法:局部最优搜索与大规模领域搜索优化配送路径的matlab实现,带时间窗的改进粒子群算法,可用于配送路径优化,改进点:添加了一个局部最优搜索--大规模领域搜索算法,收敛度更高,算法的结果更...
"遗传算法优化与动态窗口法融合:全局最优路径规划与动态环境适应策略",遗传算法(GA)优化与动态窗口法dwa融合,效果极佳,算法新颖。 -------------------------------------- 全局规划阶段,确定问题的优化目标...
利用动态规划算法进行PHEV的能量优化,以电池SOC、电池功率、发动机功率等因素作为约束条件,建立(贝尔曼方程,也就是动态规划方程)最优成本函数。 目标文件为Python脚本,有详细的注释说明。 此外还包含DP算法的...
改进PSO算法模版:集成约束优化问题的高效解决方案,改进的带约束粒子群算法(IPSO)的MATLAB代码模版:全局最优收敛与多约束问题处理的解决方案,改进的带约束粒子群算法(improved PSO)代码模版 . 会议交讲解; . ...
基于LQR控制的主动前轮转向车辆稳定性控制及ESC系统优化研究报告:离散最优反馈增益算法的实践与应用,基于LQR控制算法的主动前轮转向车辆稳定性控制与优化策略研究(自制Matlab代码、Simulink模型及详细资料),基于...
遗传算法与动态窗口法DWA融合优化:全局路径规划与动态环境适应的算法创新,遗传算法优化与动态窗口法融合:全局最优路径规划与动态环境适应策略,遗传算法(GA)优化与动态窗口法dwa融合,效果极佳,算法新颖。...
机械臂轨迹规划算法的优化研究:基于鲸鱼算法的353多项式时间最优解法与改进对比分析的Matlab源码实现,机械臂轨迹规划算法的优化研究:基于鲸鱼算法的353多项式时间最优解法与两种优化算法的对比分析——附带约束...
在这个框架中,强化学习算法负责学习最优控制策略,而TAC程序则为算法提供了一种有效的状态聚合方式,使得算法能在高维状态空间中更有效地学习和决策。通过这种方式,强化学习算法能够在探索和利用之间实现更好的...
典型路况下无人驾驶车辆局部路径规划算法:基于RRT算法与B样条拟合的智能轨迹规划及剪枝技术,典型路况下无人驾驶车辆局部路径规划算法详解:基于RRT算法最优轨迹规划,结合地图修改与B样条拟合技术,最终实现轨迹...
粒子群算法解决IEEE 33节点最优潮流模型,结合牛顿迭代法,涵盖柴油机、储能及电网交易,优质出图效果。,MATLAB代码:粒子群算法求解 IEEE 33bus最优潮流模型 关键词:粒子群算法 PSO 最优潮流 牛顿迭代 仿真平台:...
本文将探讨如何使用Matlab语言结合A*算法进行路径规划,以及如何在此基础上进一步优化算法,以寻找最优的配送方案。 首先,需要理解A*算法的基本原理。A*算法是一种启发式搜索算法,它通过评估函数f(n)=g(n)+h(n)来...
在探讨“素数最优算法”这一主题时,我们首先需要理解什么是素数,以及为何寻找素数的方法在计算机科学和数学领域中具有重要意义。素数,即只能被1和自身整除的大于1的自然数,是数论研究的基础元素之一,其特性在...
传统的启发式算法在全局最优解和求解速度上均无法满足主动配电网运行要求,而基于线性化的最优潮流方法在高阻抗的配电网中适用性也较弱。 基于此,文章建立了基于二阶锥规划(SOCP)的动态最优潮流模型框架,力图将原...
A*算法通过不断地评估这些代价,并在搜索过程中选取代价最小的节点进行扩展,从而逐步逼近最优路径。 启发策略,也就是h(n)的计算方式,对A*算法的性能有着重要影响。一个好的启发函数可以减少搜索的范围和深度,...
基于遗传算法的储能优化配置研究:成本模型分析与最优运行计划求解(含风光机组),基于遗传算法的储能优化配置:成本模型分析与最优运行计划求解(含风光机组),MATLAB代码:基于遗传算法的储能优化配置(可加入风光...
基于遗传算法的储能优化配置方案研究:成本模型分析与最优运行计划求解(含风光机组),基于遗传算法的储能优化配置方案研究:成本模型分析与最优运行计划求解(含风光机组),MATLAB代码:基于遗传算法的储能优化配置...
基于LQR最优控制算法的车辆轨迹跟踪控制模型 基于质心侧偏角等动力学参数建立模型,优化误差实现实时轨迹跟踪,仿真效果优异。,基于LQR最优控制算法实现的轨迹跟踪控制,建立了基于车辆的质心侧偏角、横摆角速度,...