¿Hay alguna manera en Java para crear una cadena con un número específico de un carácter específico? En mi caso, necesitaría crear una cadena con 10 espacios. Mi código actual es:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
¿Hay una mejor manera de lograr lo mismo? En particular, me gustaría algo que sea rápido (en términos de ejecución).
java
string
stringbuffer
Cruzar
fuente
fuente
append(' ')
en su lugar ... implica un poco menos de computación ...Respuestas:
El compilador optimizará el bucle for. En casos como el suyo, no necesita preocuparse por la optimización por su cuenta. Confía en el compilador.
Por cierto, si hay una manera de crear una cadena con n caracteres de espacio, entonces se codifica de la misma manera que lo hizo.
fuente
static Dictionary<int, String>
?" ".substring(0, 10);
Probablemente el código más corto que utiliza la
String
API, exclusivamente:Como método, sin instanciar directamente
char
:Invocar usando:
fuente
Hmm, ahora que lo pienso, tal vez
Arrays.fill
:Por supuesto, supongo que el
fill
método hace lo mismo que su código, por lo que probablemente funcionará de la misma manera, pero al menos son menos líneas.fuente
Arrays.fill()
función se usa de manera consistente para hacer este trabajo en su código y en el código de biblioteca (estándar y externo), entonces es un buen candidato para la compilación de Hotspot, y tiene una mejor oportunidad de encontrar su caché de CPU. Las JVM futuras pueden asignarlo como una función intrínseca . Rodar tu propio te corta de toda esta bondad de rendimiento ...Recomiendo no escribir el bucle a mano. Lo harás una y otra vez durante el curso de tu carrera de programación. Las personas que leen su código, eso lo incluye a usted, siempre tienen que invertir tiempo, incluso si son solo unos segundos, para digerir el significado del bucle.
En su lugar, reutilice una de las bibliotecas disponibles que proporcionan código que hace exactamente eso
StringUtils.repeat
desde Apache Commons Lang :De esa manera, tampoco tiene que preocuparse por el rendimiento, por lo que todos los detalles sangrientos
StringBuilder
, las optimizaciones del compilador, etc. están ocultos. Si la función resultara lenta, sería un error de la biblioteca.Con Java 11 se vuelve aún más fácil:
fuente
En Java 8 puedes usar
String.join
:fuente
Si solo quieres espacios, entonces ¿qué tal:
lo que dará como resultado espacios abs (n);
fuente
desde Java 11 :
desde Java 8 :
dónde:
fuente
Desde Java 11 simplemente puede usar
String.repeat(count)
para resolver su problema.Entonces, en lugar de un bucle, su código se vería así:
fuente
Creo que este es el menor código posible, usa la clase Guava Joiner:
fuente
pubic String n(int n) { ... }
que permitirá incluso "menos" código:n(10)
pero, de nuevo, no tiene ningún sentido.Puede usar la
String.format
función estándar para generar N espacios. Por ejemplo:Hace una cuerda con 5 espacios.
o
Hace una cadena de 15 barras espaciales.
Si desea que se repita otro símbolo, debe reemplazar los espacios con su símbolo deseado:
Salida:
fuente
Mi contribución basada en el algoritmo de exponenciación rápida.
Probé el algoritmo contra otros dos enfoques:
String.concat()
para concatenar una cadenaStringBuilder
Código de prueba (concatenación usando un bucle for y se
String.concat()
vuelve lento para granden
, así que lo dejé fuera después de la quinta iteración).Resultados:
Conclusión:
n
: use el enfoque recursivon
: para el bucle tiene suficiente velocidadfuente
if
declaraciones arruinarán la predicción de la rama de la CPU. Esto realmente debería rehacerse usando JMH ( openjdk.java.net/projects/code-tools/jmh ), de lo contrario es un poco inútil.¿Qué tal esto?
fuente
Considerando que tenemos:
Java 8 (Uso de Stream)
Java 8 (usando nCopies)
fuente
Collectors.joining(EMPTY_STRING)
es equivalente aCollectors.joining()
RandomStringUtils tiene una provisión para crear una cadena a partir del tamaño de entrada dado. No puedo comentar sobre la velocidad, pero es un trazador de líneas.
crea una salida
preferible si no desea ver \ 0 en su código.
fuente
Utilice StringUtils: StringUtils.repeat ('', 10)
fuente
En la mayoría de los casos, solo necesita cadenas hasta una longitud determinada, digamos 100 espacios. Puede preparar una matriz de cadenas donde el número de índice es igual al tamaño de la cadena llena de espacio y buscar la cadena, si la longitud requerida está dentro de los límites o crearla a pedido si está fuera del límite.
fuente
La solución más corta con guayaba:
Vía Forma simple de repetir una cadena en java .
fuente
Simplemente reemplace su StringBuffer con un StringBuilder . Difícil de superar eso.
Si su longitud es un número grande, podría implementar algunos autoanexos más eficientes (pero más torpes), duplicando la longitud en cada iteración:
Además, puede probar el
Arrays.fill()
enfoque ( la respuesta de FrustratedWithFormsDesigner ).fuente
Puedes reemplazar
StringBuffer
conStringBuilder
(este último no está sincronizado, puede ser más rápido en una aplicación de subproceso único)Y puede crear la
StringBuilder
instancia una vez, en lugar de crearla cada vez que la necesite.Algo como esto:
Y úsalo así:
Si mantiene su
createA
variable de instancia, puede ahorrar tiempo creando instancias.Esto no es seguro para subprocesos, si tiene varios subprocesos, cada subproceso debe tener su propia copia.
fuente
Para un buen rendimiento, combine las respuestas de aznilamir y de FrustratedWithFormsDesigner
Ajuste el tamaño de
BLANKS
acuerdo con sus requisitos. MiBLANKS
cadena específica tiene aproximadamente 200 caracteres de longitud.fuente
Tener un método como este. Esto agrega los espacios requeridos al final de lo dado
String
para hacer unaString
longitud determinada de una longitud específica.fuente
Desea que la cadena sea de tamaño fijo, para que pueda rellenar o truncar, para tabular datos ...
Excelente referencia aquí .
fuente
Esto funcionó para mí sin usar ninguna biblioteca externa en Java 8
Y la salida es
fuente
int c = 10; Espacios de cadena = String.format ("%" + c + "c", ''); Esto resolverá su problema.
fuente
También se puede usar un método simple como el siguiente
fuente
¿Qué tal esto?
EDITAR: he escrito un código simple para probar el concepto y aquí lo que encontré.
Método 1: agregar espacio único en un bucle:
Método 2: agregue 100 espacios y bucle, luego subcadena:
El resultado que obtengo al crear 12,345,678 espacios:
y para 10,000,000 espacios:
La combinación de asignación directa e iteración siempre lleva menos tiempo, en promedio 60 ms menos al crear espacios enormes. Para tamaños más pequeños, ambos resultados son insignificantes.
Pero por favor continúe comentando :-)
fuente
No conozco ningún método integrado para lo que estás preguntando. Sin embargo, para una longitud fija pequeña como 10, su método debería ser bastante rápido.
fuente