我構建了一個代表樹中根節點路徑的散列列表。我的功能可行,但它們在大型樹結構上的速度非常慢 - 有沒有更好的方法?我試過在一個函數中構建列表,但我得到了獨特的哈希,我不想要它們。構建緩慢的路徑列表
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