Estoy buscando un método u operador común simple que me permita repetir algunas veces String n . Sé que podría escribir esto usando un bucle for, pero deseo evitar los bucles cuando sea necesario y debería existir un método directo simple en alguna parte.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Relacionado con:
repetir cadena javascript Crear NSString repitiendo otra cadena un número determinado de veces
Editado
Intento evitar los bucles cuando no son completamente necesarios porque:
Se suman a la cantidad de líneas de código incluso si están ocultas en otra función.
Alguien que lea mi código tiene que descubrir qué estoy haciendo en ese bucle for. Incluso si está comentado y tiene nombres de variables significativos, todavía tienen que asegurarse de que no está haciendo nada "inteligente".
A los programadores les encanta poner cosas inteligentes en bucles, incluso si lo escribo para "hacer solo lo que está destinado a hacer", eso no impide que alguien venga y agregue alguna "solución" inteligente adicional.
A menudo es fácil equivocarse. Para los bucles que involucran índices tienden a generarse por errores de uno.
Para los bucles, a menudo se reutilizan las mismas variables, lo que aumenta la posibilidad de encontrar errores de alcance realmente difíciles.
Para los bucles, aumente el número de lugares que debe buscar un cazador de insectos.
Respuestas:
String::repeat
Nuevo en Java 11 es el método
String::repeat
que hace exactamente lo que pediste:Su Javadoc dice:
fuente
"abc".repeat(3)
Aquí está la versión más corta (se requiere Java 1.5+):
¿Dónde
n
está el número de veces que desea repetir la cadena ys
es la cadena a repetir?No se necesitan importaciones ni bibliotecas.
fuente
char[]
en este caso) seString
crean instancias con nulos, luego se crea un a partir dechar[]
, y los nulos estánreplaced()
con el personaje que deseas
...replace('\0', str)
debe utilizar en lugar de la versión de cadena.replace(char oldChar, char newChar)
yreplace(CharSequence target, CharSequence replacement)
no veo cómo podría funcionarSi está utilizando Java <= 7 , esto es tan "conciso" como se pone:
En Java 8 y superior hay una forma más legible:
Finalmente, para Java 11 y superior, hay un nuevo
repeat(int count)
método específicamente para esto ( enlace )Alternativamente, si su proyecto usa bibliotecas java, hay más opciones.
Para Apache Commons :
Para Google Guava :
fuente
n
es cero.s
tiene que ser String, no unChar
Commons Lang StringUtils.repeat ()
Uso:
fuente
Java 8's
String.join
proporciona una forma ordenada de hacer esto junto conCollections.nCopies
:fuente
Aquí hay una manera de hacerlo usando solo funciones de cadena estándar y sin bucles explícitos:
fuente
replace()
. En Java 1.5+, hay una versión sobrecargada dereplace()
dosCharSequence
segundos (que incluyeString
s): download.oracle.com/javase/1.5.0/docs/api/java/lang/…n=3
: primero formatea una cadena para que se vea algo así%03d
(%%
es para escapar del signo de porcentaje), que es el código de formato para agregar 3 ceros de relleno, luego formatea0
con eso, lo que lleva a000
, y finalmente reemplaza cada uno0
con las cadenasSi eres como yo y quieres usar Google Guava y no Apache Commons. Puede usar el método de repetición en la clase Guava Strings.
fuente
Con java-8, también puedes usar
Stream.generate
.y puede envolverlo en un método de utilidad simple si es necesario:
fuente
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
que paraleliza mejor¿Entonces quieres evitar bucles?
Aqui lo tienes:
(por supuesto, sé que esto es feo e ineficiente, pero no tiene bucles :-p)
¿Quieres que sea más simple y bonito? usa jython:
Editar : optimicemos un poco :-D
Edit2 : he hecho un punto de referencia rápido y sucio para las 4 alternativas principales, pero no tengo tiempo para ejecutarlo varias veces para obtener los medios y trazar los tiempos para varias entradas ... Así que aquí está el código si alguien quiere intentarlo:
Se necesitan 2 argumentos, el primero es el número de iteraciones (cada función se ejecuta con tiempos de repetición arg desde 1..n) y el segundo es la cadena para repetir.
Hasta ahora, una inspección rápida de los tiempos que se ejecutan con diferentes entradas deja el ranking algo así (de mejor a peor):
Nunca adiviné que la función recursiva era más rápida que el
for
bucle: -oDiviértete (ctional xD).
fuente
Este contiene menos caracteres que tu pregunta
fuente
commons-lang3.3.1-sources
y ya no eres tan bueno;) Pero si alguien ya lo ha hechocommons-lang
, apoyo tu respuesta.basado en la respuesta de fortran, esta es una versión recusiva que utiliza un StringBuilder:
fuente
Usar Dollar es simple como escribir:
PD: repetir funciona también para array, List, Set, etc.
fuente
Quería una función para crear una lista delimitada por comas de signos de interrogación para fines de JDBC, y encontré esta publicación. Entonces, decidí tomar dos variantes y ver cuál funcionó mejor. Después de 1 millón de iteraciones, el StringBuilder de la variedad de jardín tardó 2 segundos (fun1), y la versión críptica supuestamente más óptima (fun2) tomó 30 segundos. ¿Qué sentido tiene volver a ser críptico?
fuente
Solución OOP
Casi todas las respuestas proponen una función estática como solución, pero pensando en Orientación a objetos (para fines de reutilización y claridad) se me ocurrió una Solución por delegación a través de la interfaz CharSequence (que también abre la usabilidad en clases de secuencia de caracteres mutables).
La siguiente clase se puede usar con o sin Separator-String / CharSequence y cada llamada a "toString ()" construye la última cadena repetida. ¡La entrada / separador no solo se limita a String-Class, sino que puede ser cualquier clase que implemente CharSequence (por ejemplo, StringBuilder, StringBuffer, etc.)!
Código fuente:
Ejemplo de uso:
Ejemplo de salida:
fuente
usando solo clases JRE ( System.arraycopy ) e intentando minimizar la cantidad de objetos temporales, puede escribir algo como:
EDITAR
y sin bucles puedes probar con:
EDITAR 2
usar Colecciones es aún más corto:
Sin embargo, todavía me gusta la primera versión.
fuente
No es el más corto, pero (creo) la forma más rápida es usar el StringBuilder:
fuente
Si le preocupa la velocidad, entonces debe usar la menor cantidad de copia de memoria posible. Por lo tanto, se requiere trabajar con matrices de caracteres.
Para probar la velocidad, un método óptimo similar usando StirngBuilder es el siguiente:
y el código para probarlo:
Y aquí los resultados de la ejecución de mi sistema:
Tenga en cuenta que la prueba de bucle es patear JIT y tener resultados óptimos.
fuente
en aras de la legibilidad y portabilidad:
fuente
Si le preocupa el rendimiento, simplemente use un StringBuilder dentro del bucle y haga un .toString () al salir del bucle. Diablos, escribe tu propia Clase de Util y reutilízala. 5 líneas de código máx.
fuente
Realmente disfruto esta pregunta. Hay muchos conocimientos y estilos. Así que no puedo dejarlo sin mostrar mi rock and roll;)
¿Te gusta?
fuente
fuente
Bucle simple
fuente
times
al constructor StringBuilder.Probar esto:
fuente
Usando la recursividad, puede hacer lo siguiente (usando operadores ternarios, una línea como máximo):
Lo sé, es feo y probablemente no eficiente, ¡pero es una línea!
fuente
Una solución sencilla de una línea:
requiere Java 8
fuente
A pesar de su deseo de no usar bucles, creo que debería usar un bucle.
Sus razones para no usar un bucle for no son buenas. En respuesta a tus críticas:
fuente
repetitions = -5
. b) descargar Commons Lang y ejecutarrepeatString('a', 1000)
un millón de veces en un bucle; haz lo mismo con tu código; compara los tiempos. Para obtener crédito adicional, haga lo mismo conrepeatString('ab', 1000)
.StringUtils.repeat("ab",1000)
? Porque esa fue mi respuesta que has rechazado. También funciona mejor y no tiene errores.Si solo conoce la longitud de la cadena de salida (y puede no ser divisible por la longitud de la cadena de entrada), utilice este método:
Demostración de uso:
No utilice con vacío
s
ylength
> 0, ya que es imposible obtener el resultado deseado en este caso.fuente
Aquí está el último Stringutils.java StringUtils.java
ni siquiera necesita ser tan grande, puede convertirse en esto, y puede copiarse y pegarse en una clase de utilidad en su proyecto.
Entonces, e5, creo que la mejor manera de hacer esto sería simplemente usar el código mencionado anteriormente, o cualquiera de las respuestas aquí. pero commons lang es demasiado grande si es un proyecto pequeño
fuente
Creé un método recursivo que hace lo mismo que quieres ... no dudes en usar esto ...
Tengo la misma respuesta en ¿Puedo multiplicar cadenas en Java para repetir secuencias?
fuente
StringBuilder
lugar.Puede utilizar este método recursivo para su objetivo deseado.
fuente