2008-09-30 18 views
7

Tôi đang sử dụng StringBuffer trong Java để concat chuỗi với nhau, như vậy:Java: StringBuffer & Concatenation

StringBuffer str = new StringBuffer(); 

str.append("string value"); 

Tôi muốn biết nếu có một phương pháp (mặc dù tôi đã không tìm thấy bất cứ điều gì từ một cách nhanh chóng lướt qua tài liệu hướng dẫn) hoặc một số cách khác để thêm "đệm".

Hãy để tôi giải thích; mỗi lần tôi thêm một thứ gì đó vào chuỗi, tôi muốn thêm một khoảng trống vào cuối, như vậy:

String foo = "string value"; 
str.append(foo + " "); 

và tôi có một số cuộc gọi để nối thêm ... và mỗi lần, tôi muốn thêm khoảng trắng. Có cách nào để đặt đối tượng sao cho nó sẽ tự động thêm một không gian sau mỗi lần nối thêm?

EDIT -

String input 
StringBuffer query = new StringBuffer(); 
Scanner scanner = new Scanner(System.in); 
scanner.UseDelimiter("\n"); 

do { 
    System.out.println("sql> "); 

    input = scanner.next(); 

    if (!empty(input)) query.append(input); 

    if (query.toString().trim().endsWith(";")) { 
     //run query 
    } 
} 
while (!input.equalsIgnoreCase("exit"); 

tôi sẽ sử dụng StringBuilder dù như Grom gợi ý, nhưng đó là cách mã trông ngay bây giờ

+0

bạn có thể cho chúng tôi thấy một số mã thực sự của bạn nơi bạn đang thêm các mục không? Bởi vì có thể có một cách khác để xây dựng chuỗi có ý nghĩa hơn. – grom

+0

hmm, về cơ bản tôi có vòng lặp do-while nối thêm đầu vào vào một chuỗi và vòng lặp tồn tại khi đầu vào kết thúc bằng dấu ";" –

+0

Có lẽ thanh lịch hơn (và nhanh hơn) để sử dụng cụm từ thông dụng để xác định xem có chạy truy vấn hay không, ví dụ: if (query.matches (". *; \ S *")) { –

Trả lời

9

Tôi nghĩ rằng đây là xử lý dễ dàng hơn, hoặc với một phương pháp helper (mã chưa được kiểm tra):

public String myMethod() { 
    StringBuilder sb = new StringBuilder(); 
    addToBuffer(sb, "Hello").addToBuffer("there,"); 
    addToBuffer(sb, "it").addToBuffer(sb, "works"); 
} 

private StringBuilder addToBuffer(StringBuilder sb, String what) { 
    return sb.append(what).append(' '); // char is even faster here! ;) 
} 

Hoặc thậm chí sử dụng một mẫu Builder với một giao diện thông thạo (cũng chưa được kiểm tra code):

public String myMethod() { 
    SBBuilder builder = new SBBuilder() 
     .add("Hello").add("there") 
     .add("it", "works", "just", "fine!"); 

    for (int i = 0; i < 10; i++) { 
     builder.add("adding").add(String.valueOf(i)); 
    } 

    System.out.println(builder.build()); 
} 

public static class SBBuilder { 
    private StringBuilder sb = new StringBuilder(); 

    public SBBuilder add(String... parts) { 
     for (String p : parts) { 
      sb.append(p).append(' '); // char is even faster here! ;) 
     } 
     return this; 
    } 

    public String build() { 
     return sb.toString(); 
    } 
} 

Đây là một article về chủ đề này.

Hy vọng điều đó sẽ hữu ích!:)

+1

sẽ dùng thử! cảm ơn vì đã dành thời gian cho mã :) –

+0

Niềm vui của tôi. Hãy cho tôi biết nếu bạn gặp phải bất kỳ vấn đề nào và tôi sẽ rất vui khi được trợ giúp! :) – kolrie

2

Chỉ cần thêm không gian cho mình, nó đủ dễ dàng, theo riêng của bạn thí dụ.

+0

yeah thật dễ dàng, nhưng tôi thấy nó bẩn. Và nếu tôi thay đổi ý định và thay vì một không gian, tôi muốn một số nhân vật khác, tôi sẽ phải trải qua một vài dòng thay vì một! –

+0

mặc dù vâng, tôi có thể làm điều này: String bar = ""; str.append (foo + bar); nhưng tôi vẫn muốn tìm hiểu xem có cách nào tốt hơn để thực hiện điều đó không –

2

Bạn không thể tạo lớp mới bao quanh StringBuffer và thêm phương thức appendWithTrailingSpace()?

CustomStringBuffer str = new CustomStringBuffer(); 
str.appendWithTrailingSpace("string value"); 

(Mặc dù bạn có thể muốn gọi phương thức của bạn một chút gì đó ngắn hơn.)

+0

Điều đó không thể thực hiện được. StringBuffer là cuối cùng, nghĩa là không có nguồn gốc từ nó. – Burkhard

+0

Làm thế nào để một câu trả lời không chính xác nhận được chấp nhận và tồi tệ hơn upvoted? Không thể phân lớp StringBuffer – grom

+0

Rất tiếc. Bạn đúng. Tôi đã thay đổi câu trả lời để đọc "kết thúc tốt đẹp" thay vì "mở rộng". Đáng buồn thay nó không phải là gọn gàng theo cách này. –

4

StringBuffer là cuối cùng. Bạn không thể lấy được từ nó. Giải pháp tốt nhất thực sự là thêm phần đệm cho chính bạn. Viết một phương thức cho nó và sử dụng PADDING-Constant để bạn có thể dễ dàng thay đổi nó, hoặc đặt nó vào một tham số tốt hơn.

6

Bạn nên sử dụng StringBuilder.

Nếu có thể, bạn nên sử dụng lớp này tùy thuộc vào StringBuffer vì nó sẽ nhanh hơn trong hầu hết các triển khai.

1

khả năng khác là đối tượng StringBuilder trở lại chính mình khi bạn gọi thêm, có nghĩa là bạn có thể làm:

str.append("string value").append(" "); 

Không hẳn như slick, nhưng nó có lẽ là một giải pháp dễ dàng hơn so với + "" phương pháp.

Một khả năng khác là xây dựng một lớp trình bao bọc, như PaddedStringBuilder, cung cấp các phương thức giống nhau nhưng áp dụng padding mà bạn muốn, vì bạn không thể kế thừa.

Các vấn đề liên quan