正常に動作する n-ary ツリー ADT を作成しました。ただし、そのシリアル化を呼び出しクラスの変数に格納する必要があります。例えば。
DomTree<String> a = Data.createTreeInstance("very_large_file.xml");
String x = a.toString();
私はまさに必要な方法で目的を果たすメソッドを書きましたが、非常に大きな入力では永遠にかかります(100MBのxmlファイルで20分)-メソッドの時間を計り、xmlファイルからツリーを構築するのは速いですが、呼び出す上記の toString() は非常に遅いです。
@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;
}
}
ツリーのトラバース方法ではなく、文字列の構築方法に関係していると思いますか? これを行うより良い方法はありますか?
更新: Skaffman の例に従って、次のコードは非常に大きな入力に対して outOfMemoryError を返します。
@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();
}
}
更新: Skaffmans の例を使用して、完全に動作するようになりました