Sé que podemos agregar cadenas usando StringBuilder
. ¿Hay alguna forma en que podamos anteponer cadenas (es decir, agregar cadenas delante de una cadena) utilizando StringBuilder
para poder mantener los beneficios de rendimiento que StringBuilder
ofrece?
c#
java
stringbuilder
quemado
fuente
fuente
Respuestas:
Usar el método de inserción con el parámetro de posición establecido en 0 sería lo mismo que anteponer (es decir, insertar al principio).
Un ejemplo es:
varStringBuilder.insert(0, "someThing");
Funciona tanto para C # como para Java
fuente
Anteponer una cadena generalmente requerirá copiar todo después del punto de inserción de nuevo en la matriz de respaldo, por lo que no será tan rápido como agregar al final.
Pero puedes hacerlo así en Java (en C # es lo mismo, pero se llama al método
Insert
):fuente
Si necesita un alto rendimiento con muchos prependidos, deberá escribir su propia versión de
StringBuilder
(o usar la de otra persona). Con el estándarStringBuilder
(aunque técnicamente podría implementarse de manera diferente), la inserción requiere copiar los datos después del punto de inserción. Insertar n fragmentos de texto puede llevar O (n ^ 2) tiempo.Un enfoque ingenuo sería agregar un desplazamiento en el
char[]
búfer de respaldo , así como la longitud. Cuando no haya suficiente espacio para un prefijo, suba los datos más de lo estrictamente necesario. Esto puede reducir el rendimiento a O (n log n) (creo). Un enfoque más refinado es hacer que el búfer sea cíclico. De esa manera, el espacio libre en ambos extremos de la matriz se vuelve contiguo.fuente
Puedes probar un método de extensión:
fuente
Puede construir la cadena al revés y luego invertir el resultado. Usted incurre en un costo O (n) en lugar de un costo en el peor de los casos O (n ^ 2).
fuente
No lo he usado, pero Ropes For Java suena intrigante. El nombre del proyecto es un juego de palabras, use una cuerda en lugar de una cuerda para un trabajo serio. Evita la penalización de rendimiento por anteponer y otras operaciones. Vale la pena echarle un vistazo, si vas a hacer mucho de esto.
fuente
Esto es lo que puede hacer si desea anteponer el uso de la clase StringBuilder de Java:
fuente
Si te entiendo correctamente, el método de inserción parece que hará lo que quieres. Simplemente inserte la cadena en el desplazamiento 0.
fuente
Intente usar Insertar ()
fuente
A juzgar por los otros comentarios, no existe una forma rápida estándar de hacer esto. Usar StringBuilder's
.Insert(0, "text")
es aproximadamente solo 1-3 veces más rápido que usar una concatenación de cadenas dolorosamente lenta (basada en> 10000 concats), por lo que a continuación se muestra una clase para anteponer potencialmente miles de veces más rápido.He incluido alguna otra funcionalidad básica como
append()
,subString()
ylength()
etc. Tanto los anexos como los antepuestos varían desde aproximadamente el doble de rápido hasta 3 veces más lento que los anexos de StringBuilder. Como StringBuilder, el búfer en esta clase aumentará automáticamente cuando el texto desborde el tamaño del búfer anterior.El código se ha probado bastante, pero no puedo garantizar que esté libre de errores.
fuente
Puede crear una extensión para StringBuilder usted mismo con una clase simple:
Luego, solo agrega:
En la parte superior de cualquier clase en la que desee usar StringBuilder y cada vez que use intelli-sense con una variable StringBuilder, aparecerán los métodos Prepend y PrependLine. Solo recuerde que cuando use Anteponer, deberá anteponer en orden inverso que si estuviera anexando.
fuente
Esto debería funcionar:
fuente
string
, pero no funciona con valores de tipoStringBuilder
. La respuesta de @ScubaSteve funciona bien.