initial example java stringbuilder

example - stringbuilder replace java



¿Eliminar el último carácter de un StringBuilder? (16)

Cuando tiene que recorrer una colección y hacer una cadena de cada información separada por un delimitador, siempre termina con un delimitador adicional al final, por ejemplo

for(String serverId : serverIds) { sb.append(serverId); sb.append(","); }

Da algo como: serverId_1, serverId_2, serverId_3,

Me gustaría eliminar el último carácter en el StringBuilder (sin convertirlo porque todavía lo necesito después de este bucle).


A partir de Java 8, la clase String tiene una join método estático. El primer argumento es una cadena que desea entre cada par de cadenas, y el segundo es una Iterable<CharSequence> (que son ambas interfaces, así que algo como List<String> funciona. Así que puede hacer esto:

String.join(",", serverIds);

También en Java 8, puede usar la nueva clase StringJoiner , para los escenarios donde desea comenzar a construir la cadena antes de tener la lista completa de elementos para poner en ella.


Alternativamente,

StringBuilder result = new StringBuilder(); for(String string : collection) { result.append(string); result.append('',''); } return result.substring(0, result.length() - 1) ;


Aquí hay otra solución:

for(String serverId : serverIds) { sb.append(","); sb.append(serverId); } String resultingString = ""; if ( sb.length() > 1 ) { resultingString = sb.substring(1); }


Con Java-8 puedes usar el método estático de String clase String ,

join

public class Test { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("James"); names.add("Harry"); names.add("Roy"); System.out.println(String.join(",", names)); } }

SALIDA

James,Harry,Roy


En este caso,

sb.setLength(sb.length() - 1);

es preferible ya que simplemente asigna el último valor a ''/0'' mientras que eliminar el último carácter hace System.arraycopy


Estoy haciendo algo como a continuación:

StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < value.length; i++) { stringBuilder.append(values[i]); if (value.length-1) { stringBuilder.append(", "); } }


Otra alternativa

for(String serverId : serverIds) { sb.append(","); sb.append(serverId); } sb.deleteCharAt(0);


Otra alternativa más:

public String join(Collection<String> collection, String seperator) { if (collection.isEmpty()) return ""; Iterator<String> iter = collection.iterator(); StringBuilder sb = new StringBuilder(iter.next()); while (iter.hasNext()) { sb.append(seperator); sb.append(iter.next()); } return sb.toString(); }


Otra solución simple es:

sb.setLength(sb.length() - 1);

Una solución más complicada:

La solución anterior asume que sb.length() > 0 ... es decir, hay un "último carácter" para eliminar. Si no puede hacer esa suposición y / o no puede lidiar con la excepción que se produciría si la suposición es incorrecta, verifique primero la longitud del StringBuilder; p.ej

// Readable version if (sb.length() > 0) { sb.setLength(sb.length() - 1); }

o

// Concise but harder-to-read version of the above. sb.setLength(Math.max(sb.length() - 1, 0));


Otros han señalado el método deleteCharAt , pero aquí hay otro enfoque alternativo:

String prefix = ""; for (String serverId : serverIds) { sb.append(prefix); prefix = ","; sb.append(serverId); }

Alternativamente, use la clase Joiner de Guava :)

A partir de Java 8, StringJoiner es parte del JRE estándar.


Para evitar reiniciar (afectar el rendimiento) del prefix use TextUtils.isEmpty:

String prefix = ""; for (String item : list) { sb.append(prefix); if (TextUtils.isEmpty(prefix)) prefix = ","; sb.append(item); }


Personalmente, me gusta añadir un carácter de retroceso (o más para un "delimitador" más largo) al final:

for(String serverId : serverIds) { sb.append(serverId); sb.append(","); } sb.append(''/b'');

Tenga en cuenta que tiene problemas:

  • cómo se muestra /b depende del entorno,
  • la length() del contenido de la String puede ser diferente de la longitud de los caracteres "visibile"

Cuando /b ve bien y la longitud no importa, como iniciar sesión en una consola, esto me parece lo suficientemente bueno.


Puede intentar usar la clase ''Joiner'' en lugar de eliminar el último carácter de su texto generado;

List<String> textList = new ArrayList<>(); textList.add("text1"); textList.add("text2"); textList.add("text3"); Joiner joiner = Joiner.on(",").useForNull("null"); String output = joiner.join(textList); //output : "text1,text2,text3"


Solo obtén la posición de la última ocurrencia del personaje.

for(String serverId : serverIds) { sb.append(serverId); sb.append(","); } sb.deleteCharAt(sb.lastIndexOf(","));

Como lastIndexOf realizará una búsqueda inversa, y sabe que se encontrará en el primer intento, el rendimiento no será un problema aquí.


StringBuilder sb = new StringBuilder(); sb.append("abcdef"); sb.deleteCharAt(sb.length() - 1); assertEquals("abcde",sb.toString()); // true


sb.deleteCharAt(sb.length() - 1)