2008-09-30 25 views
7

estoy usando StringBuffer en Java a concat cadenas juntas, así:Java: StringBuffer y concatenación

StringBuffer str = new StringBuffer(); 

str.append("string value"); 

me gustaría saber si hay un método (aunque no he encontrado cualquier cosa de una rápida vistazo a la documentación) o de alguna otra manera para agregar "relleno".

Me explico; cada vez que añado algo a la cadena, quiero añadir un espacio al final, de este modo:

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

y tengo varias llamadas para anexar .. y cada vez, quiero añadir un espacio. ¿Hay alguna forma de configurar el objeto para que agregue un espacio automáticamente después de cada anexión?

EDITAR -

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

Voy a usar StringBuilder aunque como Grom sugirió, pero así es como el código se ve en este momento

+0

nos muestras un poco de su código real en la que está anexando artículos? Porque tal vez haya otra forma de construir la cuerda que tenga más sentido. – grom

+0

hmm, básicamente tengo un ciclo do-while que agrega una entrada a una cadena y el ciclo existe cuando la entrada termina con un ";" –

+0

Es probable que sea más elegante (y más rápido) para utilizar una expresión regular para determinar si se debe ejecutar la consulta o no, por ejemplo: "(. *; \ S *" query.matches()) {si –

Respuesta

9

creo que esto se maneja más fácil, ya sea con un método de ayuda (código no probado):

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

O incluso usando un Builder con una interfaz fluida (también el código no probado):

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

Aquí hay un article sobre el tema.

Espero que ayude!:)

+1

lo probará! gracias por pasar tiempo en el código :) –

+0

Mi placer. ¡Avíseme si encuentra algún tipo de problema y estaré encantado de ayudarle! :) – kolrie

2

Apenas añada el espacio mismo, es bastante fácil, como por su propia ejemplo.

+0

sí que es fácil, pero encontrarlo sucio. Y si cambio de opinión y en lugar de espacio, quiero otro personaje, ¡tendría que pasar por varias líneas en vez de una! –

+0

aunque sí, podría hacer esto: String bar = ""; str.append (foo + barra); pero aun así quiero averiguar si hay una mejor manera de hacerlo. –

2

¿No puedes crear una nueva clase que se ajuste a StringBuffer y añades un método appendWithTrailingSpace()?

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

(Aunque es posible que desee llamar a su método de algo un poco más corto.)

+0

Eso no debería ser posible. StringBuffer es final, es decir, no derivación de él. – Burkhard

+0

¿Cómo se acepta una respuesta incorrecta y se sube la votación? No es posible crear la subclase StringBuffer – grom

+0

Whoops. Tienes razón. Cambié la respuesta para leer "envuelve" en lugar de "extender". Lamentablemente, no es tan limpio de esta manera. –

4

StringBuffer es definitiva. No puedes derivar de eso. La mejor solución es realmente agregar el relleno para usted mismo. Escribe un método para ello y usa una constante de relleno para que puedas cambiarla fácilmente o ponerla mejor en un parámetro.

6

Debería utilizar StringBuilder.

Siempre que sea posible, se recomienda que esta clase se use con preferencia a StringBuffer, ya que será más rápida en la mayoría de las implementaciones.

1

Otra posibilidad es que los objetos StringBuilder vuelven a sí mismos cuando se llama a añadir, lo que significa que puede hacer:

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

No es tan resbaladiza, pero es probable que sea una solución más fácil que el método + "".

Otra posibilidad es construir una clase contenedora, como PaddedStringBuilder, que proporciona los mismos métodos, pero se aplica el relleno que desee, ya que no se puede heredar.

Cuestiones relacionadas