Más precisamente: StringBuffer para jdk1.4 y posteriores, StringBuilder para jdk1.5 y posteriores, ya que este último no está sincronizado, por lo que es un poco más rápido.
VonC
2
En lugar de dos invocaciones iter.hasNext (), normalmente agrego delímetro y luego "return buf.substring (0, buf.length () - delimeter.length ())".
Vilmantas Baranauskas
2
Puede simplificarlo un poco saliendo temprano para evitar el delimitador: while (true) (add_iter; if (! Iter.hasNext ()) break; add_delim;}
En cuanto a unirse, creo que esto podría parecer un poco menos complicado:
publicStringjoin(Collection<String> c){StringBuilder sb=newStringBuilder();for(String s: c)
sb.append(s);return sb.toString();}
No puedo usar la sintaxis de Java 5 tanto como me gustaría (lo crea o no, he estado usando 1.0.x últimamente), así que puede que esté un poco oxidado, pero estoy seguro de que el concepto es correcto .
adición de edición: las adiciones de cadenas pueden ser lentas, pero si está trabajando en un código GUI o alguna rutina de ejecución corta, realmente no importa si toma .005 segundos o .006, por lo que si tenía una colección llamada "joinMe" que desea agregar a un "destino" de cadena existente, no sería horrible simplemente incluir esto:
for(String s : joinMe)
target += s;
Es bastante ineficiente (y un mal hábito), pero no es nada que pueda percibir a menos que haya miles de cadenas o esto esté dentro de un bucle enorme o su código sea realmente crítico para el rendimiento.
Más importante aún, es fácil de recordar, breve, rápido y muy legible. El rendimiento no siempre es el ganador automático en las opciones de diseño.
El bucle for es correcto, pero también debería convertirlo en una Colección <String>. Si no lo hace, tendría que decir "for (Object o: c)", porque no puede garantizar que todo en c sea una cadena.
Michael Myers
Buen punto, estoy aún más oxidado con los genéricos. Lo editaré en.
Bill K
Cuando se concatena en línea: cadena + cadena + cadena, el compilador realmente usa StringBuilder para agregar los valores. Me pregunto si en el método de bucle for tienes el segundo allí, si el compilador haría lo mismo.
Spencer Kormos
@Spencer K: Utiliza un StringBuilder, pero crea uno nuevo para cada iteración (no es el método más eficiente, pero ¿cómo se supone que debe saber el compilador?). No sé si el compilador JIT podría optimizar eso en tiempo de ejecución.
Michael Myers
2
Oh espera. ¿Estás hablando + =? Sí, eso apesta. El bucle y el anexo actualmente en mi respuesta usan StringBuilder y eso es de lo que estoy hablando. Aunque + = ha mejorado mucho, realmente no desea usarlo dentro de un bucle, no tanto porque tenga errores, sino porque puede funcionar como una mierda (Bug no es un término que se usa generalmente para problemas de rendimiento, al menos no en mis 20 años de programación). Además, el JIT puede mejorar esto enormemente, pero no confiaría en eso.
Bill K
4
Aquí hay una respuesta bastante simple. Úselo +=ya que es menos código y deje que el optimizador lo convierta a StringBuilderpor usted. Con este método, no tiene que hacer ninguna comprobación "es la última" en su ciclo (mejora del rendimiento) y no tiene que preocuparse por eliminar los delimitadores al final.
¡Solución muy elegante, que no involucra bibliotecas de terceros!
Denis Itskovich
2
No quería importar una biblioteca de Apache completa para agregar una función de unión simple, así que aquí está mi truco.
publicStringjoin(String delim,List<String> destinations){StringBuilder sb =newStringBuilder();int delimLength = delim.length();for(String s: destinations){
sb.append(s);
sb.append(delim);}// we have appended the delimiter to the end // in the previous for-loop. Let's now remove it.if(sb.length()>= delimLength){return sb.substring(0, sb.length()- delimLength);}else{return sb.toString();}}
@MrSnowflake ¿El generador de cadenas estándar tiene un método "removeCharAt (int index)"? No aparece en la versión que estoy ejecutando
NSjonas
@NSjonas: sí, su edición de mi respuesta es incorrecta. El removeCharAtno existe, y la función completa ya no devuelve un String ... Arreglará esto.
Martin Konecny
mientras está en eso ... esta solución actual arrojará una "excepción de índice fuera de los límites si pasa una lista vacía"
NSjonas
hizo una edición para recortar la longitud correcta si el delimitador tiene más de 1 carácter. También se solucionó un problema en el que estaba recortando el último carácter y no el primero como realmente lo necesitaba
NSjonas
Gracias por los comentarios. Actualizado.
Martin Konecny
1
Si desea unir (concatenar) varias cadenas en una, debe usar un StringBuilder. Es mucho mejor que usar
for(String s : joinMe)
target += s;
También hay una ligera ventaja de rendimiento sobre StringBuffer, ya que StringBuilder no usa la sincronización.
Para un método de utilidad de propósito general como este, (eventualmente) se llamará muchas veces en muchas situaciones, por lo que debe hacerlo eficiente y no asignar muchos objetos transitorios. Hemos perfilado muchas, muchas aplicaciones Java diferentes y casi siempre encontramos que la concatenación de cadenas y las asignaciones de cadenas / caracteres [] consumen una cantidad significativa de tiempo / memoria.
Nuestra colección reutilizable -> método string primero calcula el tamaño del resultado requerido y luego crea un StringBuilder con ese tamaño inicial; esto evita la duplicación / copia innecesaria del carácter interno [] que se usa al agregar cadenas.
re: cálculo previo del tamaño: cuando funciona, es genial. No siempre es posible. Recuerdo haber leído en algún lugar que duplicar el tamaño del búfer cada vez (o realmente multiplicarlo por cualquier factor fijo) da algo como un rendimiento de n log n, que en realidad no es tan malo. En el caso general, la alternativa es hacer una lista de todas las cadenas que planea concatenar. Si usa un ArrayList, tendrá que copiar nuevamente (a menos que sepa la longitud de su secuencia de antemano) y si usa LinkedList, entonces usa más ram y recolección de basura con los objetos de nodo. A veces no puedes ganar. ¡Inténtalo!
Ian
Los ejemplos / consultas anteriores asumieron alguna colección ordenada o matriz de cadenas para unirse. Además, al calcular previamente el tamaño, evita caracteres adicionales no utilizados en los que el crecimiento de la matriz char [] interna suele
Veo muchas implementaciones demasiado complejas de String. Únete aquí. Si no tiene Java 1.8 y no desea importar una nueva biblioteca, la siguiente implementación debería ser suficiente.
publicStringjoin(Collection<String> col,String delim){StringBuilder sb =newStringBuilder();for(String s : col ){if( sb.length()!=0) sb.append(delim);
sb.append(s);}return sb.toString();}
No estoy seguro de qué parte de la pregunta responde esto. No es un String.format a menos que planee agregar los bits de la cadena bit a bit a la matriz, y [1,0.92,3] no es tan versátil como una cadena genérica .join.
Omar Kooheji
-8
Solo usaría el operador de concatenación de cadenas "+" para unir dos cadenas. s1 += s2;
Respuestas:
El objeto String de Java tiene un
format
método (a partir de la 1.5), pero ningúnjoin
método.Para obtener un montón de métodos de utilidad String útiles que aún no están incluidos, puede usar org.apache.commons.lang.StringUtils .
fuente
String.join()
método.String.format . En cuanto a unirse, debe escribir el suyo propio:
Lo anterior proviene de http://snippets.dzone.com/posts/show/91
fuente
Guava viene con la
Joiner
clase .fuente
A partir de Java 8,
join()
ahora está disponible como dos métodos de clase en la clase String. En ambos casos, el primer argumento es el delimitador.Puede pasar
CharSequence
s individuales como argumentos adicionales :O puede pasar un
Iterable<? extends CharSequence>
:Java 8 también agrega una nueva clase
StringJoiner
, que puede usar así:fuente
TextUtils.join está disponible en Android
fuente
También puede utilizar argumentos variables para cadenas de la siguiente manera:
fuente
En cuanto a unirse, creo que esto podría parecer un poco menos complicado:
No puedo usar la sintaxis de Java 5 tanto como me gustaría (lo crea o no, he estado usando 1.0.x últimamente), así que puede que esté un poco oxidado, pero estoy seguro de que el concepto es correcto .
adición de edición: las adiciones de cadenas pueden ser lentas, pero si está trabajando en un código GUI o alguna rutina de ejecución corta, realmente no importa si toma .005 segundos o .006, por lo que si tenía una colección llamada "joinMe" que desea agregar a un "destino" de cadena existente, no sería horrible simplemente incluir esto:
Es bastante ineficiente (y un mal hábito), pero no es nada que pueda percibir a menos que haya miles de cadenas o esto esté dentro de un bucle enorme o su código sea realmente crítico para el rendimiento.
Más importante aún, es fácil de recordar, breve, rápido y muy legible. El rendimiento no siempre es el ganador automático en las opciones de diseño.
fuente
Aquí hay una respuesta bastante simple. Úselo
+=
ya que es menos código y deje que el optimizador lo convierta aStringBuilder
por usted. Con este método, no tiene que hacer ninguna comprobación "es la última" en su ciclo (mejora del rendimiento) y no tiene que preocuparse por eliminar los delimitadores al final.fuente
No quería importar una biblioteca de Apache completa para agregar una función de unión simple, así que aquí está mi truco.
fuente
removeCharAt
no existe, y la función completa ya no devuelve un String ... Arreglará esto.Si desea unir (concatenar) varias cadenas en una, debe usar un StringBuilder. Es mucho mejor que usar
También hay una ligera ventaja de rendimiento sobre StringBuffer, ya que StringBuilder no usa la sincronización.
Para un método de utilidad de propósito general como este, (eventualmente) se llamará muchas veces en muchas situaciones, por lo que debe hacerlo eficiente y no asignar muchos objetos transitorios. Hemos perfilado muchas, muchas aplicaciones Java diferentes y casi siempre encontramos que la concatenación de cadenas y las asignaciones de cadenas / caracteres [] consumen una cantidad significativa de tiempo / memoria.
Nuestra colección reutilizable -> método string primero calcula el tamaño del resultado requerido y luego crea un StringBuilder con ese tamaño inicial; esto evita la duplicación / copia innecesaria del carácter interno [] que se usa al agregar cadenas.
fuente
Escribí propio:
pero
Collection
no es compatible con JSP, por lo que para la función de etiqueta escribí:y
.tld
archivar:y utilícelo en archivos JSP como:
fuente
StringUtils es una clase bastante útil en la biblioteca Apache Commons Lang.
fuente
Hay
MessageFormat.format()
que funciona como C #String.Format()
.fuente
Veo muchas implementaciones demasiado complejas de String. Únete aquí. Si no tiene Java 1.8 y no desea importar una nueva biblioteca, la siguiente implementación debería ser suficiente.
fuente
Básicamente, String ntop almacena el valor de toda la colección con separadores de coma y corchetes.
fuente
Solo usaría el operador de concatenación de cadenas "+" para unir dos cadenas.
s1 += s2;
fuente