¿Cómo podemos recortar un valor de StringBuilder
sin la sobrecarga causada por el uso de StringBuilder.toString().trim()
y crear así una nueva instancia String
y/o una nueva StringBuilder
para cada llamada de recorte?Cómo recortar la cadena de StringBuilder?
Respuesta
¿Por qué StringBuilder No recorte método() tienen
- Porque esa es la forma en que fue diseñado. Intenta preguntar a los diseñadores.
- Porque no hay mucha demanda.
- Porque la semántica y la firma String
trim()
no se ajustan a las cadenas mutables, aunque eso es discutible.
De cualquier forma, la respuesta no es relevante para resolver su problema.
y cómo podemos recortar un valor de StringBuilder?
La forma más sencilla es utilizar StringBuilder.toString().trim()
...
no quiero utilizar StringBuilder.toString(). Trim().
En ese caso, por lo que necesita hacer lo que trim()
hace debajo de las fundas: haga coincidir y elimine el espacio en blanco inicial y posterior. Dado que la API de StringBuilder no tiene compatibilidad con expresiones regulares, tendrá que hacerlo de la manera más difícil; es decir, iterando los caracteres de adelante hacia atrás y hacia atrás para ver qué personajes necesitan ser eliminados, etcétera.
¿Estás seguro de que no preferirías hacerlo de la manera fácil? Si no, esto Q & A tiene algunas implementaciones ejemplo, el análisis, la evaluación comparativa, etcétera:
En realidad estoy en un bucle donde tengo que comparar esta cadena StringBuilder con muchos otros valores, de modo que si llamo StringBuilder.toString(). trim() cada vez, creará una nueva instancia y no quiero crear un nuevo objeto String cada vez.
La otra cara de la moneda es que la eliminación de caracteres desde el inicio de un StringBuilder implica la copia de todos los caracteres restantes.
Tal vez sería mejor convertir el StringBuilder completo en una Cadena para empezar, luego cuando use trim()
y substring()
y similares, no estará copiando caracteres. (Estos métodos funcionan creando una nueva Cadena que comparte la matriz de respaldo de la Cadena original ...así que solo terminas copiando la información de control de la cadena. ACTUALIZACIÓN - En Java 7 se cambió el comportamiento de trim
y substring
para que se utiliza un constructor de cadena que copia una del subconjunto de la matriz de soporte)
Estaba pasando por una respuesta similar a la suya: http://stackoverflow.com/questions/7510422/when-should-we-change -a-string-to-a-stringbuilder. Y yo diría que has respondido esto perfectamente bien. –
@KazekageGaara - gracias :-) –
"¿Por qué X no ocurre? Porque no es así". Muy constructivo ¿Conoces alguna de las razones por las que los diseñadores no implementaron toString()? – Buffalo
Puede convertir la instancia StringBuilder
en string
que luego se puede recortar.
sb.toString().trim();//sb is stringBuilder Instance.
¿Por qué no StringBuilder método trim() tiene.?
Hmm .. StringBuilder
es como String
, sólo una pequeña diferencia que puede ser modificado después de la creación de lo contrario es igual que la cadena.
Como se indica en enlace de arriba, Las principales operaciones en un StringBuilder son la agregación y de insertar métodos. Supongo que se proponen para admitir cadenas mutables, al igual que con StringBuffer
. Y si puede hacer las cosas con una pequeña llamada a algún otro método y luego a un método deseado, entonces, ¿cuál es el problema? Por qué quieres la misma implementación en múltiples clases.
¿Cómo podemos recortar un valor de StringBuilder?
Como se ha dicho por otros stringBuilder.toString().trim();
no quiero utilizar
StringBuilder.toString().trim()
.
Hmm ... ¿asunto de elección, algún motivo específico para esto?
En realidad estoy en un bucle donde tengo que comparar esta cadena StringBuilder con muchos otros valores, así que si llamo a StringBuilder .toString(). trim() cada vez, creará una nueva instancia y no quiero crear un nuevo objeto String cada vez –
Use su propio 'char []' y delimitadores a continuación. Echa un vistazo al código 'java.lang.String'. – mschonaker
Usa StringBuilder.toString().trim()
pero guárdalo en una variable.
Por ejemplo:
String myTrimmedString = myStringBuilder.toString().trim();
que no tiene un método trim()
porque es muy fácil y algo preferido usar objetos inmutables. Imagine que un hilo está recortando el StringBuilder
mientras que otro se le agrega. Imagina los errores y la rareza que podrían causar en tu código.
Imagine que un hilo está recortando StringBuilder mientras que otro se le agrega. Esta situación también puede ocurrir en la operación de agregar, mientras que un hilo se agrega algo y uno agrega algo más ... ¿qué sucede en ese caso? tampoco debería admitir append –
@PramodKumar Me imagino que la máquina virtual solo permite que una cosa escriba al char [] a la vez. Sin embargo, poner la misma restricción en las lecturas sería ridículo. En una lectura y escritura simultáneas, supongo que bloquea la lectura, por lo que no es un problema. Todo depende de la implementación de la máquina virtual. Es muy posible que trim() funcione bien. Era una situación hipotética mostrar cuánto más fácil puede ser implementar objetos inmutables. Y usan menos memoria. – iracigt
Aunque su solución es correcta, su justificación está muy lejos. StringBuilder no es seguro para subprocesos * por diseño *, así que, como dijo Pramod Kumar, ** cualquier ** operación concurrente es peligrosa. Cualquiera que use un StringBuilder en múltiples hilos sin sincronizar necesita disparar. StringBuffer es la versión de StringBuilder segura para subprocesos, ya que utiliza sincronización interna. * (StringBuilder se introdujo en Java para situaciones en las que está seguro de que solo un subproceso tendrá acceso a él a la vez, por lo que quería prescindir de la sobrecarga de la sincronización en StringBuffer). – megaflop
No sé lo que está tratando de lograr, pero si le preocupa el rendimiento, tal vez podría realizar el ajuste al agregarlo a StringBuilder.
stringbuilder.append(string.trim())
- 1. StringBuilder: cómo obtener la cadena final?
- 2. Cadena, StringBuffer y StringBuilder
- 3. Javascript recortar una cadena a la longitud
- 4. Recortar caracteres de una cadena
- 5. String.Format vs "cadena" + "cadena" o StringBuilder?
- 6. StringBuilder vs Cadena considerando reemplazar
- 7. Cómo recortar una cadena en MS SQL?
- 8. ¿Cómo puedo Recortar la coma inicial en mi cadena
- 9. Recortar los últimos 4 caracteres de la cadena?
- 10. La mejor forma de recortar espacios en una cadena
- 11. Recortar cadena con juego de caracteres específico
- 12. ¿Cómo cambia la capacidad de StringBuilder?
- 13. StringBuilder o + =
- 14. capacidad StringBuilder()
- 15. Cómo clonar() StringBuilder
- 16. php cómo recortar cada línea en un heredoc (cadena larga)
- 17. Cómo reutilizar StringBuilder obj?
- 18. Recortar una cadena en java para obtener la primera palabra
- 19. Ámbito de uso de StringBuffer/StringBuilder de cadena
- 20. cómo recortar la cadena de dirección IP para obtener las primeras 3 partes de la misma?
- 21. Reemplazar todas las ocurrencias de una Cadena usando StringBuilder?
- 22. Adjuntar con StringBuilder
- 23. ¿Cómo se implementa la clase StringBuilder? ¿Crea internamente nuevos objetos de cadena cada vez que agregamos?
- 24. clase de cadena Python como StringBuilder en C#?
- 25. Cómo recortar el UIImage?
- 26. ¿Cuál es la forma canónica de recortar una cadena en Ruby sin crear una nueva cadena?
- 27. ¿Cómo heredas StringBuilder en vb.net?
- 28. Cómo recortar la representación en OpenGL (C++)
- 29. cómo recortar la imagen en pedazos programáticamente
- 30. Cómo recortar la imagen analizada en android?
¿Puedo preguntar por qué no desea utilizar 'StringBuilder.toString(). Trim()'? –
En realidad, estoy en un bucle en el que tengo que comparar esta cadena StringBuilder con muchos otros valores, así que si llamo a StringBuilder.toString(). Trim() cada vez, creará una nueva instancia y no quiero crear un nuevo objeto String cada vez. –
Puede usar 'toString(). Trim()' tantas veces como necesite. Por favor, edite su pregunta y agregue su comentario anterior para aclarar. – mschonaker