我构建了一个代表树中根节点路径的散列列表。我的功能可行,但它们在大型树结构上的速度非常慢 - 有没有更好的方法?我试过在一个函数中构建列表,但我得到了独特的哈希,我不想要它们。构建缓慢的路径列表
public ArrayList<Integer> makePathList(AbstractTree<String> tree){
StringBuilder buffer = new StringBuilder();
ArrayList<Integer> pl = new ArrayList<Integer>();
ArrayList<StringBuilder> paths = getPaths(tree, buffer);
for(StringBuilder sb : paths){
pl.add(sb.toString().hashCode());
}
return pl;
}
public ArrayList<StringBuilder> getPaths(AbstractTree<String> tree, StringBuilder parent){
ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();
parent.append("/");
parent.append(tree.getNodeName());
list.add(new StringBuilder(parent));
if (!tree.isLeaf()){
int i = 0;
Iterator<AbstractTree<String>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size()){
list.addAll(getPaths(child.next(), new StringBuilder(parent)));
i++;
}
}
return list;
}
UPDATE:
马尔钦的建议,使树遍历期间散列给出了错误的答案,但也许这是我做的方式?
public ArrayList<Integer> getPaths(AbstractTree<String> tree, StringBuilder parent){
ArrayList<Integer> list = new ArrayList<Integer>();
parent.append("/");
parent.append(tree.getNodeName());
list.add(new StringBuilder(parent).toString().hashCode());
if (!tree.isLeaf()){
int i = 0;
Iterator<AbstractTree<String>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size()){
list.addAll(getPaths(child.next(), new StringBuilder(parent)));
i++;
}
}
return list;
}
我不知道如何使用jvisualvm,但我使用100MB XML树计时了这些方法。 使得路径... \t做[3614ms] 创建的散列码... \t做[962ms] \t共完成[4576ms] – Robert 2009-07-24 12:13:04
它将无法识别的核心问题在这种情况下,但你真的应该学会如何使用visualvm等分析器。这是攻击性能问题的唯一专业方式。 – 2009-07-24 12:24:20
我强烈建议学习如何使用分析器。 jvisualvm是最低的挂果。 – 2009-07-24 12:32:07