Джава:StringBuffer и конкатенация
-
02-07-2019 - |
Вопрос
Я использую 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, как предложил Гром, но сейчас код выглядит именно так.
Решение
Я думаю, что это проще сделать с помощью вспомогательного метода (непроверенный код):
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();
}
}
Вот статья на предмет.
Надеюсь, поможет!:)
Другие советы
Вы должны использовать Строитель строк.
По возможности рекомендуется использовать этот класс вместо StringBuffer, поскольку в большинстве реализаций он будет работать быстрее.
StringBuffer является окончательным.Вы не можете извлечь из этого пользу.Лучшее решение — добавить отступ самостоятельно.Напишите для него метод и используйте константу PADDING, чтобы вы могли легко изменить ее или, лучше, поместить в параметр.
Можете ли вы создать новый класс, который будет охватывать StringBuffer
и добавьте appendWithTrailingSpace()
метод?
CustomStringBuffer str = new CustomStringBuffer();
str.appendWithTrailingSpace("string value");
(Хотя вы можете назвать свой метод немного короче.)
Просто добавьте пространство самостоятельно, это достаточно просто, согласно вашему собственному примеру.
Другая возможность заключается в том, что объекты StringBuilder возвращают себя при вызове метода добавления, что означает, что вы можете сделать:
str.append("string value").append(" ");
Не так просто, но, вероятно, это более простое решение, чем метод + " ".
Другая возможность — создать класс-оболочку, например PaddedStringBuilder, который предоставляет те же методы, но применяет нужные вам дополнения, поскольку вы не можете наследовать.