Vì vậy, từ những gì tôi có thể nói có 3 vấn đề ở đây:
- Giá trị chủ yếu được thêm vào phía trước chuỗi.
- Đối với mỗi giá trị, một ký tự được nối vào.
- Nếu chỉ có một giá trị, không có gì được thêm vào hoặc được thêm vào trước.
- Với 2 hoặc nhiều mục, mục 0 được xử lý khác nhau:
0: ""
1: "A"
2: "| (B, A) "
3:" | (C, | (B, A))"
Nó có thể được thực hiện nhanh hơn bằng cách thực hiện một vài thay đổi:
- Đảo ngược thuật toán, điều này có nghĩa là phần lớn công việc liên quan đến phụ thêm, cho phép bạn sử dụng StringBuilders.
- Đếm số lượng đóng
)
và thêm sau khi vòng lặp kết thúc.
- Trường hợp đặc biệt cho 0 hoặc 1 mục trong danh sách.
Với những thay đổi đó, thuật toán sẽ có thể sử dụng StringBuilder và nhanh hơn rất nhiều.
Nỗ lực tại một thuật toán:
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();
}
tôi tin này nên tạo ra kết quả chính xác, nhưng nó sẽ cho ý tưởng đúng.
bạn muốn đạt được điều gì? kết quả mong đợi của bạn là gì? – Andrew
@AndrewTobilko Anh ấy muốn có cách nhanh hơn để thực hiện điều này cho hiệu suất. – Gendarme
Bạn đã thử chèn vào một StringBuilder chưa? https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#insert(int,%20java.lang.String) Hoặc đảo ngược 'mệnh đề' trước khi lặp lại, điều đó có cho phép bạn không chỉ nối thêm? – Robert