J'ai écrit un arbre ADT n-aire qui fonctionne correctement. Cependant, j'ai besoin de stocker sa sérialisation dans une variable d'une classe appelante. par exemple.Concaténation de chaîne lente sur une grande entrée
DomTree<String> a = Data.createTreeInstance("very_large_file.xml");
String x = a.toString();
J'ai méthode écrit qui sert le but exactement comment j'ai besoin, mais sur les entrées très importantes, il prend une éternité (20min sur un fichier xml 100Mo) - J'ai chronométré les méthodes et la construction de l'arbre de la Le fichier xml est rapide, mais appeler toString() comme indiqué ci-dessus est très lent.
@Override
public String toString(){
return printTree(this);
}
public String printTree(AbstractTree<E> tree){
if (tree.isLeaf()){
return tree.getNodeName();
}else{
String tStr = tree.getNodeName() + "(";
int i = 0;
Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size() - 1){
tStr += printTree(child.next()) + ", ";
i++;
}
tStr += printTree(child.next()) + ")";
return tStr;
}
}
Je suppose que cela est lié à la façon dont la chaîne est construite plutôt qu'à la façon dont l'arbre est traversé? Y a-t-il une meilleure manière de faire cela? MISE À JOUR: À l'instar de Skaffman, le code suivant donne outOfMemoryError pour une très grande entrée.
@Override
public String toString(){
StringBuilder buffer = new StringBuilder();
printTree(this, buffer);
return buffer.toString();
}
public String printTree(AbstractTree<E> tree, StringBuilder buffer){
if (tree.isLeaf()){
return tree.getNodeName();
}else{
buffer.append(tree.getNodeName());
buffer.append("(");
int i = 0;
Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size() - 1){
buffer.append(printTree(child.next(), buffer));
buffer.append(", ");
i++;
}
buffer.append(printTree(child.next(), buffer));
buffer.append(")");
return buffer.toString();
}
}
MISE À JOUR: Fonctionne parfaitement maintenant, en utilisant par exemple Skaffmans
Ne pas deviner. Procurez-vous un profileur et mesurez-le. – skaffman
OK, vous mélangez et associez maintenant des approches anciennes et nouvelles. J'ai mis à jour ma réponse pour vous montrer ce que je veux dire dans son intégralité. – skaffman