【发布时间】:2010-11-10 17:09:47
【问题描述】:
我写了一个工作正常的 n 叉树 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 示例
【问题讨论】:
-
别猜了。给自己找一个分析器并测量它。
-
好的,您现在正在混合和匹配新旧方法。我已经更新了我的答案,以向您完整展示我的意思。
标签: java optimization string-concatenation