Java: StringBuffer & Concatenation - PullRequest
       22

Java: StringBuffer & Concatenation

7 голосов
/ 30 сентября 2008

Я использую StringBuffer в Java для объединения строк, например:

StringBuffer str = new StringBuffer();

str.append("string value");

Я хотел бы знать, есть ли метод (хотя я не нашел ничего из быстрого взгляда на документацию) или какой-то другой способ добавить «отступ».

Позвольте мне объяснить; каждый раз, когда я добавляю что-то к строке, я хочу добавить в конце пробел, например:

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

и у меня есть несколько звонков для добавления ... и каждый раз, я хочу добавить пробел. Есть ли способ установить объект так, чтобы он автоматически добавлял пробел после каждого добавления?

РЕДАКТИРОВАТЬ -

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");

Я буду использовать StringBuilder, хотя, как и предположил Гром, но именно так сейчас выглядит код

Ответы [ 6 ]

9 голосов
/ 30 сентября 2008

Я думаю, что это легче сделать с помощью вспомогательного метода (непроверенный код):

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! ;)
}

Или даже используя шаблон Builder с открытым интерфейсом (также непроверенный код):

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();
    }
}

Вот статья на эту тему.

Надеюсь, это поможет! :)

6 голосов
/ 30 сентября 2008

Вы должны использовать StringBuilder .

Где возможно, рекомендуется использовать этот класс вместо StringBuffer, так как он будет быстрее при большинстве реализаций.

4 голосов
/ 30 сентября 2008

StringBuffer является окончательным. Вы не можете извлечь из этого. Лучшее решение на самом деле это добавить отступы для себя. Напишите для него метод и используйте константу PADDING, чтобы вы могли легко ее изменить или, лучше, поместить в параметр.

3 голосов
/ 30 сентября 2008

Разве вы не можете создать новый класс, который охватывает StringBuffer и добавить метод appendWithTrailingSpace()?

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

(Хотя вы можете назвать свой метод как-нибудь покороче.)

2 голосов
/ 30 сентября 2008

Просто добавьте пробел самостоятельно, это достаточно просто, согласно вашему примеру.

1 голос
/ 30 сентября 2008

Другая возможность состоит в том, что объекты StringBuilder возвращают себя при вызове append, что означает, что вы можете сделать:

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

Не так гладко, но, вероятно, это более простое решение, чем метод "+".

Другой возможностью является создание класса-оболочки, такого как PaddedStringBuilder, который предоставляет те же методы, но применяет требуемый отступ, поскольку вы не можете наследовать.

...