Ho scritto un ADT di albero n-ario che funziona correttamente. Tuttavia, ho bisogno di memorizzare la sua serializzazione in una variabile di una classe chiamante. per esempio.Concatenazione di stringhe lente su input di grandi dimensioni
DomTree<String> a = Data.createTreeInstance("very_large_file.xml");
String x = a.toString();
Ho metodo che serve allo scopo esattamente come ho bisogno scritto, ma molto grandi ingressi ci vuole sempre (20 minuti su un file di 100 MB xml) - ho cronometrato i metodi e costruendo l'albero dal il file xml è veloce, ma chiamare toString() come mostrato sopra è molto lento.
@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;
}
}
Sto indovinando che è a che fare con il modo in cui la corda è costruito, piuttosto che come l'albero viene attraversato? C'è un modo migliore per farlo?
AGGIORNAMENTO: Seguendo l'esempio di Skaffman, il seguente codice fornisce outOfMemoryError per un input molto grande.
@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: Funziona perfettamente ora, utilizzando Skaffmans esempio
Non indovinare. Prendi un profiler e misuralo. – skaffman
OK, stai mescolando e abbinando vecchi e nuovi approcci ora. Ho aggiornato la mia risposta per mostrarti cosa intendo per intero. – skaffman