当前位置: 首页 > 面试题库 >

大输入时字符串连接速度慢

曾飞雨
2023-03-14
问题内容

我已经写了一个工作正常的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示例可以完美运行


问题答案:

像这样的弦乐伴奏速度非常慢。使用StringBuilder。

@Override
public String toString(){
        StringBuilder buffer = new StringBuilder();
        printTree(this, buffer);
        return buffer.toString();
}

public void printTree(AbstractTree<E> tree, StringBuilder buffer){
    if (tree.isLeaf()){
        buffer.append(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){
            printTree(child.next(), buffer);
            buffer.append(", ");
            i++;
        }
        printTree(child.next(), buffer); 
        buffer.append(")");
    }
}


 类似资料:
  • 本文向大家介绍jQuery 限制输入字符串长度,包括了jQuery 限制输入字符串长度的使用技巧和注意事项,需要的朋友参考一下 我们后台做程序的时候,比如录入一篇文章,文章会有摘要,我们希望文章的字符长度是我们可以控制的,我们不希望它太长,比如限制只能输入250个字符,下面的代码实现了这种功能。 先来看一下效果图 代码如下: 以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持呐喊教程

  • 问题内容: String a = “devender”; String b = “devender”; String c = “dev”; String d = “dev” + “ender”; String e = c + “ender”; a 和 b 都指向字符串常量池中的同一String Literal。所以在情况1 应该在内部使用类似- a 和 d 如何指向同一参考而不是 a & e ?

  • 问题内容: 我有以下代码 输出为。 Java如何完成字符串连接的技巧? 问题答案: 因为Java将表达式转换为类似 实际上,我认为它可能使用s,因此: 解决更高效 这使用“ 字符串”构建器上的方法(针对每种类型),这些方法可以正确处理

  • 本文章将介绍Thymeleaf标准表达式语法中的概念。 学习如何在Thymeleaf模板中显示对象(Bean)的属性值。 已经将类的bean已经设置为名称为的上下文模型。 为这些和属性添加一些格式,学习使用字符串相连接输出。 最后,修改模板以获得一个合理的静态原型(例如,通过一些原型数据替换并显示结果)。 如果要上机实践,请参考:Thymeleaf+SpringMVC5示例项目。这里不再重复创建项

  • 我正在读一本书叫做。NET Gotchas(非常值得一读),它说明了String和StringBuilder之间的性能差异,它提出了一个我觉得不能没有答案的问题!虽然我不知道这两个类的内部结构(不看这些类的反射版本),但我想知道;因为运算符在。NET是可重载的,为什么微软没有实现String类来在内部使用StringBuilder并重载连接运算符来简单调用。在StringBuilder中追加()?

  • Parameter Position Type Required cat Description 1 string No empty This value to catentate to the given variable. 将cat里的值连接到给定的变量后面. This value is concatenated to the given variable. 将cat里的值连接到给定的变量后面