这是我的论坛某一篇回复。虽然与楼主要求不一致,但这种结构在实际开发中很常见,比较有代表意义,因此收入博客。
原问题是这样的
有一字符串,格式为
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);
}
}
分享到:
相关推荐
通过上述讨论可以看出,带特征线约束的Delaunay三角剖分最优算法的研究及实现,不仅在理论上有所突破,更在实践中展现出了极高的应用价值。随着未来数据量的持续增长和技术的进步,这类算法的重要性将更加凸显。
程序还需要你自己编写,这只不过是一个指导性的公式,思路清晰,相信对于掌握基本的编程技术的朋友来说编写比较简单。
《程序设计经典算法 最优算法 人工智能》这个资源包涵盖了多方面的IT知识,主要集中在程序设计、算法优化以及人工智能这三个核心领域。以下是这些主题的详细解释: 1. **程序设计**: 程序设计是计算机科学的基础...
彩票3D 的最优算法,用c#语言开发。包括复式算法(无重复算法) 、 组3全包、 组6全包等方法
任务 :建立建立最优二叉树函数 要求:可以建立函数输入二叉树,并输出其赫夫曼树 在上交资料中请写明:存储结构、 基本算法(可以使用程序流程图) 、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外...
最优二叉树 最优二叉树算法
1. 排序算法: - 冒泡排序:基础排序算法,通过不断交换相邻元素实现排序。 - 选择排序:每次找到未排序部分的最小值,然后放到已排序部分的末尾。 - 插入排序:将元素逐个插入到已排序部分的正确位置。 - 快速...
最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法
在本文中,我们将深入探讨“最优调度算法”这一主题,特别是以C语言实现的一个简单版本。 最优调度算法的目标是最大化系统性能,这通常意味着最小化任务的平均完成时间、提高响应时间或者优化处理器的利用率。在单...
针对车载导航系统和交通监控系统中的最优路径这一关键技术,研究了矢量电子地图数据结构及其用它表示的真实道路网络的特点。探讨了基于电子地图最优路径求解的启发式代价树搜索算法,并提出了不同情形下的求解策略。
移动机器人路径规划是机器人学的一个重要领域。它要求机器人依据某些规则和原理,在工作区域当中找到一条从起始状态到目标状态规避障碍...这里采用蚁群算法的信息素的原理进行寻找最优化距离,做出障碍区块和最优路径!
Johnson(流水作业调度的最优算法) Johnson算法是解决流水作业调度问题的一种动态规划算法。流水作业调度问题是指将n个作业分解成m个任务,并将这些任务安排到m台机器上进行加工的过程。该问题的目标是找到一种...
针对原有最优旅游路线优化模型关于最短路线的获取性能较差的问题,构建基于蚁群优化算法的最优旅游路线优化模型,设定旅游景点地理信息格式,完成地理信息抽取。设定路线选取流程,引用蚁群算法完成最优路线选取工作...
粒子群优化算法(Particle Swarm Optimization, PSO)是一种基于群体智能的全局优化方法,由Eberhart和Kennedy于1995年提出。该算法灵感来源于鸟群觅食的行为,其中每个鸟(粒子)代表可能的解决方案,通过在搜索...
在本实验中,我们主要探讨的是“独立任务最优调度”问题,这是一...通过参考这份实验报告,读者不仅可以理解独立任务最优调度问题,还能掌握动态规划算法的应用和优化技巧,这对于深入理解和解决类似问题具有重要价值。
总的来说,"aco.rar_aco 路径_matlab_最优算法_蚁群算法路径"这个压缩包文件提供的内容可能包括了使用MATLAB实现蚁群算法解决最优路径问题的源代码。通过理解和应用这些代码,我们可以学习如何利用ACO解决实际的优化...
关键词:综合能源 分布式协同优化 交替方向乘子法 最优潮流 参考文档:《基于串行和并行ADMM算法的电_气能量流分布式协同优化_瞿小斌》 仿真平台:MATLAB 主要内容:本代码是较为全面的ADMM算法代码,实现了三种ADMM...
一种大致基于模拟进化的学习方法,遍历所有可能性,选取最优
Java 最优二叉树的哈夫曼算法的简单实现 Java 最优二叉树的哈夫曼算法的简单实现是对哈夫曼树的构建和实现。哈夫曼树是一种特殊的二叉树,它的每个结点都带有权值,并且遵循着大的值离根近、小的值离根远的原则,...