请考虑以下数据集,它是String
的列表。
{"20.01","20.01.01","20.01.01.01","20.01.02","20.01.02.01","20.01.02.02","20.02","20.02.01","20.02.01.01","20.02.02","20.02.02.01","20.02.02.02","20.02.02.02.01","20.02.02.02.01.01","20.02.02.02.02","20.02.02.02.03"}
我想使用Java将其组织为基于树的数据结构。我的预期输出将如下所示:
20.01
20.01.01
20.01.01.01
20.01.02
20.01.02.01
20.01.02.02
20.02
20.02.01
20.02.01.01
20.02.02
20.02.02.01
20.02.02.02
20.02.02.02.01
20.02.02.02.01.01
20.02.02.02.02
20.02.02.02.03
答案 0 :(得分:0)
这里的输入是由我们要构建的树的深度优先遍历生成的标签列表,其中每个标签都描述了节点的完整路径。鉴于此,我们实际需要的只是每个节点的深度,可以通过计算标签中的级别分隔符('.'
)的数量来获得。
使用此信息,可以使用以下算法构建原始树:
static int buildTree(TreeNode parent, String[] input, int idx)
{
TreeNode last = null;
while(idx < input.length)
{
int depth = input[idx].replaceAll("[^.]", "").length();
if(depth == parent.depth + 1)
{
parent.children.add(last = new TreeNode(input[idx++], depth));
}
else if(depth > parent.depth + 1)
{
idx = buildTree(last, input, idx);
}
else break;
}
return idx;
}
static class TreeNode
{
int depth;
String label;
List<TreeNode> children;
TreeNode(String label, int depth)
{
this.label = label;
this.depth = depth;
children = new ArrayList<>();
}
}
在提供的输入上进行测试:
public static void main(String[] args)
{
String[] input = {"20.01","20.01.01","20.01.01.01","20.01.02",
"20.01.02.01","20.01.02.02","20.02","20.02.01","20.02.01.01",
"20.02.02","20.02.02.01","20.02.02.02","20.02.02.02.01",
"20.02.02.02.01.01","20.02.02.02.02","20.02.02.02.03"};
TreeNode root = new TreeNode("", 0);
buildTree(root, input, 0);
print(root.children, "");
}
static void print(Collection<TreeNode> children, String ind)
{
for(TreeNode n : children)
{
System.out.println(ind + n.label);
print(n.children, ind + " ");
}
}
输出:
20.01
20.01.01
20.01.01.01
20.01.02
20.01.02.01
20.01.02.02
20.02
20.02.01
20.02.01.01
20.02.02
20.02.02.01
20.02.02.02
20.02.02.02.01
20.02.02.02.01.01
20.02.02.02.02
20.02.02.02.03
答案 1 :(得分:-2)
你的意思是这样吗?
public static void main(String[] args){
String[] str_tb={"20.01","20.01.01","20.01.01.01","20.01.02","20.01.02.01","20.01.02.02","20.02","20.02.01","20.02.01.01","20.02.02","20.02.02.01","20.02.02.02","20.02.02.02.01","20.02.02.02.01.01","20.02.02.02.02","20.02.02.02.03"}
for(str : str_tb){
int counter = StringUtils.countMatches(str,".")-1;
while(counter-- != 0){
System.out.print("\t");
}
System.out.println(str);
}
}
我不确定,您指的是“ Java对象”。如果您希望将其打印出来,则将此代码删除即可解决该问题。