Java: StringBuffer & Concatenation

我是研究僧i 提交于 2019-11-30 03:30:53

问题


I'm using StringBuffer in Java to concat strings together, like so:

StringBuffer str = new StringBuffer();

str.append("string value");

I would like to know if there's a method (although I didn't find anything from a quick glance at the documentation) or some other way to add "padding".

Let me explain; every time I append something to the string, I want to add a space in the end, like so:

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

and I have several calls to append.. and every time, I want to add a space. Is there a way to set the object so that it will add a space automatically after each append?

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

I'll use StringBuilder though as grom suggested, but that's how the code looks right now


回答1:


I think this is handled easier either with a helper method (untested code):

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

Or even using a Builder pattern with a fluent interface (also untested 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();
    }
}

Here's an article on the subject.

Hope it helps! :)




回答2:


You should be using StringBuilder.

Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.




回答3:


StringBuffer is final. You cannot derive from it. The Best solution really is to add the padding for yourself. Write a method for it and use a PADDING-Constant so that you can easily change it, or better put it in a parameter.




回答4:


Can you not create a new class which wraps around StringBuffer and add an appendWithTrailingSpace() method?

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

(Although you may want to call your method something a little shorter.)




回答5:


Just add the space yourself, it's easy enough, as per your own example.




回答6:


Another possibility is that StringBuilder objects return themselves when you call append, meaning you can do:

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

Not quite as slick, but it is probably an easier solution than the + " " method.

Another possibility is to build a wrapper class, like PaddedStringBuilder, that provides the same methods but applies the padding you want, since you can't inherit.



来源:https://stackoverflow.com/questions/152190/java-stringbuffer-concatenation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!