Я строю список хешей, которые представляют корневые пути узлов в дереве. Мои функции работают, но они невероятно медленны над большими древовидными структурами - есть ли лучший способ? Я попытался создать список в одной функции, но я получаю уникальные хэши, где я их не хочу.Медленный список путей построения
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: предложение
Marcin, чтобы сделать хэш во время обхода дерева дает неправильный ответ, но, возможно, это так, как я сделал это?
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;
}
Это звучит как интересное решение - есть ли у вас пример такого метода? – Robert
У меня нет времени, чтобы предоставить рабочий код, но в основном вместо того, чтобы строить путь в экземплярах StringBuilder, представляйте путь как список элементов пути, каждый из которых имеет имя и частичный хэш до этого элемента. –