【问题标题】:Java: StringBuffer & ConcatenationJava:字符串缓冲区和连接
【发布时间】:2010-09-14 05:02:57
【问题描述】:

我在 Java 中使用 StringBuffer 将字符串连接在一起,如下所示:

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

尽管按照 grom 的建议,我将使用 StringBuilder,但这就是代码现在的样子

【问题讨论】:

  • 这可能对你有帮助:stackoverflow.com/questions/63150/…
  • 您能否向我们展示一些您在其中附加项目的实际代码?因为也许还有另一种构建字符串的方法更有意义。
  • hmm,我基本上有一个 do-while 循环,它将输入附加到一个字符串,并且当输入以“;”结尾时循环存在
  • 使用正则表达式来确定是否运行查询可能更优雅(也更快),例如: if (query.matches(".*;\s*")) {
  • 检查输入是否以 ';' 结尾不是更好吗?而不是每次都将缓冲区转换为字符串?

标签: java concatenation stringbuffer


【解决方案1】:

只需自己添加空间,就很简单,按照你自己的例子。

【讨论】:

  • 是的,这很简单,但我觉得它很脏。如果我碰巧改变主意,而不是空格,我想要其他字符,我必须通过几行而不是一行!
  • 虽然是的,我可以这样做: String bar = " "; str.append(foo + bar);但我仍然想知道是否有更好的方法
【解决方案2】:

你不能创建一个新的类来包裹StringBuffer 并添加一个appendWithTrailingSpace() 方法吗?

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

(尽管您可能希望将您的方法称为更短的名称。)

【讨论】:

  • 这应该是不可能的。 StringBuffer 是最终的,即没有派生自它。
  • 不正确的答案如何被接受并获得更糟糕的支持?不能继承 StringBuffer
  • 哎呀。你说得对。我已将答案更改为“环绕”而不是“扩展”。可悲的是,这种方式并不那么整洁。
  • 我实际上认为包装字符串缓冲区就可以了。在这种情况下,子类化并不合适——您实际上是在使用组合创建一个“构建器”对象。没有错,如果以后决定使用不同的实现,你可以......
【解决方案3】:

StringBuffer 是最终的。你不能从中得到。 最好的解决方案确实是为自己添加填充。为它编写一个方法并使用 PADDING-Constant 以便您可以轻松更改它,或者更好地将其放入参数中。

【讨论】:

    【解决方案4】:

    您应该使用StringBuilder

    在可能的情况下,建议优先使用此类而不是 StringBuffer,因为它在大多数实现下会更快。

    【讨论】:

      【解决方案5】:

      另一种可能性是 StringBuilder 对象在您调用 append 时返回自己,这意味着您可以这样做:

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

      没有那么圆滑,但它可能是比 + " " 方法更简单的解决方案。

      另一种可能性是构建一个包装类,如 PaddedStringBuilder,它提供相同的方法但应用您想要的填充,因为您不能继承。

      【讨论】:

        【解决方案6】:

        我认为使用辅助方法(未经测试的代码)更容易处理:

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

        这是一个关于这个主题的article

        希望对您有所帮助! :)

        【讨论】:

        • 我的荣幸。如果您遇到任何问题,请告诉我,我很乐意为您提供帮助! :)
        猜你喜欢
        • 2020-05-07
        • 1970-01-01
        • 2018-08-16
        • 2021-12-10
        • 2013-07-10
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多