javascript - 基于全路径的层次节点路径生成
问题描述
我有一个 SQL 查询,它通过连接所有通向根节点的节点返回从叶到节点的完整路径,例如叶“H”是:
H-G-F-E-D-C-B-A
其中 A 是根节点。这个连接值是叶子 H 的 id,因为它是通向这个叶子并且不会重复的所有节点的组合,路径上的每个节点 id 都是它自己加上它的祖先的连接:
H-G-F-E-D-C-B-A =>LEAF ID
G-F-E-D-C-B-A
F-E-D-C-B-A
E-D-C-B-A
D-C-B-A
C-B-A
B-A
A => ROOT ID
问题是,我需要一种算法,它可以生成上面列出的所有路径,但只能从 HFEDCBA 之类的字符串开始。所有路径都可以以字符串数组的形式返回,语言可以是 java、python 或 javascript,对于当前的应用程序,我更喜欢 javascript,但任何可以显示算法的语言都可以。
目前这是我在 javascript 中所拥有的:
var text = "";
var array =[];
var i=0;
var j=0;
var pathstring = 'H-G-F-E-D-C-B-A';
var pathleaf = pathstring.split('-');
for (i=0; i< pathleaf.length; i++)
{
for (j=0; j< pathleaf.length; j++)
{
if(j-1>=0)
array.push(pathleaf[j] +"-"+ pathleaf[j-1]);
}
if(i-1>=0){
text += array[i] +"-"+ array[i-1] + "<br>";
}
}
测试返回:
F-G-G-H
E-F-F-G
D-E-E-F
C-D-D-E
B-C-C-D
A-B-B-C
G-H-A-B
解决方案
这是一种在 Java 中执行此操作的方法,您可能可以适应 Javascript。
static String[] leafIDs(String s)
{
List<String> sa = new ArrayList<>();
char[] ca = new char[s.length()];
for(int j=0, i=s.length()-1; i>=0; i--,j++)
{
if((ca[j] = s.charAt(i)) == '-') sa.add(new String(ca, 0, j));
}
sa.add(new String(ca));
return sa.toArray(new String[sa.size()]);
}
或者您可以使用StringBuilder
static String[] leafIDsSB(String s)
{
List<String> sa = new ArrayList<>();
StringBuilder b = new StringBuilder();
for(int i=s.length()-1; i>=0; i--)
{
char c = s.charAt(i);
if(c == '-') sa.add(b.toString());
b.append(c);
}
sa.add(b.toString());
return sa.toArray(new String[sa.size()]);
}
测试
public static void main(String[] args)
{
for(String so : leafIDs("H-G-F-E-D-C-B-A")) System.out.println(so);
}
输出:
A
A-B
A-B-C
A-B-C-D
A-B-C-D-E
A-B-C-D-E-F
A-B-C-D-E-F-G
A-B-C-D-E-F-G-H
推荐阅读
- c - 这个推理我哪里错了?
- mysql - 无法将年份与不同的表字段进行比较
- vba - Excel VBA - 范围选择溢出错误
- php - 我想在我的网站上显示为字符串
- node.js - 使用节点 js 将语音保存到本地文本
- objective-c - ld:未找到框架 GoogleMapsCore clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- php - php中字符串的Json编码返回false
- ios - 当我从 Scheme Url 启动应用程序时未调用 openUrl
- json - 正则表达式匹配字符串中的特定字符并修改它
- shopify - Shopify 附加脚本