2012-06-19 42 views
22

¿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?

+1

¿Puedo preguntar por qué no desea utilizar 'StringBuilder.toString(). Trim()'? –

+1

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. –

+0

Puede usar 'toString(). Trim()' tantas veces como necesite. Por favor, edite su pregunta y agregue su comentario anterior para aclarar. – mschonaker

Respuesta

18

¿Por qué StringBuilder No recorte método() tienen

  1. Porque esa es la forma en que fue diseñado. Intenta preguntar a los diseñadores.
  2. Porque no hay mucha demanda.
  3. 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)

+1

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. –

+0

@KazekageGaara - gracias :-) –

+5

"¿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

0

Puede convertir la instancia StringBuilder en string que luego se puede recortar.

sb.toString().trim();//sb is stringBuilder Instance. 
1

¿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.

StringBuilder

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?

+1

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 –

+0

Use su propio 'char []' y delimitadores a continuación. Echa un vistazo al código 'java.lang.String'. – mschonaker

1

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.

+2

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 –

+0

@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

+1

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

3

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())

Cuestiones relacionadas