9 java string performance loops concatenation
我遇到了性能问题.有没有人有更快/更好的解决方案来执行以下操作:
String main = "";
for (String proposition : propositions) {
if (main.length() == 0) {
main = proposition;
} else {
main = "|(" + proposition + "," + main + ")";
}
}
Run Code Online (Sandbox Code Playgroud)
我知道concat和stringbuilder更快,但我不知道如何使用这些方法.由于以下代码行:
main = "|(" + proposition + "," + main + ")";
Run Code Online (Sandbox Code Playgroud)
提前致谢!
所以从我可以看出这里有3个问题:
0: ""
1: "A"
2: "|(B,A)"
3: "|(C,|(B,A))"
通过进行一些更改可以更快地完成:
)并在循环结束后附加那些.通过这些更改,算法应该能够使用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();
}
Run Code Online (Sandbox Code Playgroud)
我相信这应该产生正确的结果,但它应该给出正确的想法.
问题是你正在前置并附加到字符串.String和StringBuilder不能很好地处理这个问题(并提供二次性能).但是您可以使用支持在开始和结束时插入的出列来存储所有部分.最后你可以加入出队的比特.
ArrayDeque bits = new ArrayDeque();
for (String proposition : propositions) {
if (bits.size() == 0) {
bits.push(proposition);
} else {
// Add prefix
main.offerFirst("|(" + proposition + "," );
// Add suffix
main.push(")");
}
}
StringBuilder sb = new StringBuilder();
for( String s : bits) {
sb.append(s);
}
main = sb.toString();
Run Code Online (Sandbox Code Playgroud)