我遇到性能问题。有没有人有更快/更好的解决方案来执行以下操作:

    String main = "";
    for (String proposition : propositions) {
        if (main.length() == 0) {
            main = proposition;
        } else {
            main = "|(" + proposition + "," + main + ")";
        }
    }

我知道concat和stringbuilder更快,但是我看不到如何使用这些方法。由于以下代码行:
main = "|(" + proposition + "," + main + ")";

提前致谢!

最佳答案

因此,据我所知,这里存在3个问题:

  • 值主要在字符串之前。
  • 对于每个值,将附加一个字符。
  • 如果仅存在一个值,则不应添加或添加任何内容。
  • 如果有2个或更多项目,则第0个项目的处理方式有所不同:


  • 通过进行一些更改可以使其更快:
  • 反转算法,这意味着大部分工作都涉及追加,从而允许您使用StringBuilders。
  • 计算关闭的)的数量,并在循环完成后附加这些数量。
  • 列表中0或1项的特殊情况。

  • 经过这些更改,该算法应该能够使用StringBuilder并且更快。
    尝试算法:
    int length = propositions.size();
    if (length == 0) {
        main = "";
    } else {
        StringBuilder sb = new StringBuilder();
        int nestingDepth = 0;
        // Reverse loop, ignoring 0th element due to special case
        for (int i = length - 1; i > 0; i--) {
            sb.append("|(").append(propositions.get(i)).append(',');
            nestingDepth++;
        }
        // Append last element due to special casing
        sb.append(propositions.get(0));
        for (int i = 0; i < nestingDepth; i++) {
            sb.append(')');
        }
    
        main = sb.toString();
    }
    
    我相信这应该会产生正确的结果,但是应该给出正确的想法。

    09-25 17:04
    查看更多