java – 大输入上的慢字符串连接

前端之家收集整理的这篇文章主要介绍了java – 大输入上的慢字符串连接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个n-ary树ADT工作正常.但是,我需要将其序列化存储在变量调用类中.例如.
  1. DomTree<String> a = Data.createTreeInstance("very_large_file.xml");
  2. String x = a.toString();

我编写的方法完全符合我的需要,但是在非常大的输入上它需要永远(在100MB xml文件上20分钟) – 我有时间方法并从xml文件构建树很快,但调用toString()如上所示非常慢.

  1. @Override
  2. public String toString(){
  3. return printTree(this);
  4. }
  5.  
  6. public String printTree(AbstractTree<E> tree){
  7. if (tree.isLeaf()){
  8. return tree.getNodeName();
  9. }else{
  10. String tStr = tree.getNodeName() + "(";
  11.  
  12. int i = 0;
  13. Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
  14. while (i < tree.getChildren().size() - 1){
  15.  
  16. tStr += printTree(child.next()) + ",";
  17. i++;
  18. }
  19. tStr += printTree(child.next()) + ")";
  20.  
  21. return tStr;
  22. }
  23. }

我猜它是用字符串构建的方式而不是遍历树的方式?有一个更好的方法吗?

更新:遵循Skaffman的示例,以下代码为非常大的输入提供outOfMemoryError.

  1. @Override
  2. public String toString(){
  3. StringBuilder buffer = new StringBuilder();
  4. printTree(this,buffer);
  5. return buffer.toString();

}

  1. public String printTree(AbstractTree<E> tree,StringBuilder buffer){
  2. if (tree.isLeaf()){
  3. return tree.getNodeName();
  4. }else{
  5. buffer.append(tree.getNodeName());
  6. buffer.append("(");
  7.  
  8. int i = 0;
  9. Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
  10. while (i < tree.getChildren().size() - 1){
  11.  
  12. buffer.append(printTree(child.next(),buffer));
  13. buffer.append(",");
  14. i++;
  15. }
  16. buffer.append(printTree(child.next(),buffer));
  17. buffer.append(")");
  18.  
  19. return buffer.toString();
  20. }
  21. }

更新:现在使用Skaffmans示例完美地工作

解决方法

像这样的字符串连接速度非常慢.使用StringBuilder.
  1. @Override
  2. public String toString(){
  3. StringBuilder buffer = new StringBuilder();
  4. printTree(this,buffer);
  5. return buffer.toString();
  6. }
  7.  
  8. public void printTree(AbstractTree<E> tree,StringBuilder buffer){
  9. if (tree.isLeaf()){
  10. buffer.append(tree.getNodeName());
  11. } else {
  12. buffer.append(tree.getNodeName());
  13. buffer.append("(");
  14.  
  15. int i = 0;
  16. Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
  17. while (i < tree.getChildren().size() - 1){
  18. printTree(child.next(),buffer);
  19. buffer.append(",");
  20. i++;
  21. }
  22. printTree(child.next(),buffer);
  23. buffer.append(")");
  24. }
  25. }

猜你在找的Java相关文章