Je construis une liste de hachages qui représentent les chemins de racine à noeud dans un arbre. Mes fonctions fonctionnent mais elles sont incroyablement lentes sur de grandes structures d'arbres - y a-t-il un meilleur moyen? J'ai essayé de construire la liste dans une fonction mais j'ai des hachages uniques où je ne les veux pas.Liste de chemins de construction lente
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;
}
MISE À JOUR:
suggestion de Marcin pour faire le hachage lors de la traversée de l'arbre donne la mauvaise réponse, mais peut-être est la façon dont je l'ai fait?
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;
}
Cela ressemble à une solution intéressante - avez-vous un exemple d'une telle méthode? – Robert
Je n'ai pas le temps de fournir le code de travail, mais fondamentalement, au lieu de construire le chemin dans les instances de StringBuilder, représente un chemin comme une liste d'éléments de chemin, chacun avec un nom et un hash partiel vers cet élément. –