Powolna konkatenacja ciągu na dużym wejściu
Napisałem drzewo ADT, które działa dobrze. Muszę jednak przechowywać jego serializację w zmiennej klasy wywołującej. na przykład.
DomTree<String> a = Data.createTreeInstance("very_large_file.xml");
String x = a.toString();
Napisałem metodę, która służy dokładnie temu, czego potrzebuję, ale na bardzo dużych nakładach trwa wiecznie (20 minut na pliku xml 100 MB) - zmierzyłem czas metod i zbudowanie drzewa z pliku xml jest szybkie, ale wywołanie toString () jak pokazano powyżej jest bardzo powolny.
@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;
}
}
Zgaduję, że ma to związek ze sposobem, w jaki struna jest budowana, a nie z tym, w jaki sposób przechodzi drzewo? Czy jest lepszy sposób, aby to zrobić?
AKTUALIZACJA: Podążając za przykładem Skaffmana, poniższy kod daje outOfMemoryError dla bardzo dużych danych wejściowych.
@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();
}
}
UPDATE: Działa doskonale teraz, używając przykładu Skaffmansa