Cadenas de caracteres

Resumen del capítulo 13 (Cadenas de caracteres) del "Libro Thinking in Java (4ta Edición)".

Introducción

Los objetos de clase String son inmutables. Todos los métodos de la clase que parecen modificar una cadena de caracteres, lo que hacen en realidad, es devolver un objeto String completamente nuevo que contiene dicha modificación. Puesto a que este tipo de objetos es inmutable, se pueden establecer tantos alias como se desee, pero no hay ninguna posibilidad de que una referencia modifique algo que pueda afectar a otras referencias.
Los operadores ‘+’ y ‘=+’ para objetos String son los únicos operadores sobrecargados en Java. El compilador cuando se encuentra con alguno de estos operadores (que intentan concatenar Strings), lo que hace es crear un objeto StringBuilder. Con una instancia de esta clase, se invoca el método append() la cantidad de veces necesarias para cada concatenación, y finalmente se invoca el método toString() para devolver el resultado.
Los objetos StringBuilder disponen de un conjunto completo de métodos como: insert(), delete(), replace(), substring(), reverse(), append() y toString().
Ver ejemplo: Main01.java

Clase Formatter

Una de las características incorporadas en Java SE5 es el formateo de la salida al estilo de la instrucción printf() de C. Toda la nueva funcionalidad de formateo de Java es gestionada por la clase Formatter del paquete java.util. Esta clase se puede considerar como una especie de traductor que convierte la cadena de formato y los datos al resultado deseado. Cuando se instancia un objeto Formatter, se le indica a donde se deben mandar los resultados. El constructor de la clase se encuentra sobrecargado para admitir diversas ubicaciones de salida, pero las más útiles son PrintStream, OutputStream y File.
Existe un atajo para realizar el formateo de la salida sin utilizar un objeto Formatter. Todos los objetos PrintStream o PrintWriter (dentro de los que se incluye System.out) tienen disponible el método format().
Para controlar el espaciado y la alineación cuando se insertan los datos, hacen falta especificadores de formato más elaborados:
%[indice_argumento$][indicadores][anchura][.precisión]conversión
  • Índice argumento: Indica el índice del argumento que será utilizado para realizar la conversión.
  • Indicadores: De manera predeterminada, los datos se justifican a la derecha. Para justificar los datos a la izquierda se debe incluir el indicador ‘-‘.
  • Anchura: Permite controlar el tamaño mínimo de un campo. Se garantiza que un campo tenga al menos una anchura de un cierto número de caracteres, rellenándolo con espacios en caso de ser necesario. (Es aplicable a todos los tipos de conversión de datos).
  • Precisión: Se utiliza para especificar un máximo. Tiene un significado distinto para los diferentes tipos:
    - Cadenas de caracteres: Especifica el número máximo de caracteres del objeto String que hay que imprimir.
    - Números en coma flotante: Especifica el numero de posiciones decimales que hay que mostrar (el valor predeterminado el 6), efectuando un redondeo si hay más dígitos o añadiendo más ceros al final si hay pocos.
    - Enteros: La precisión no es aplicable ya que no tienen parte fraccionaría. Se generará una excepción si se utiliza este argumento.
Caracteres de conversión:
  • d: Entero (como decimal)
  • c: Carácter Unicode
  • b: Valor booleanos: Cadena de caracteres
  • f: Coma flotante (como decimal)
  • e: Coma flotantes (en notación científica)
  • x: Entero (como hexadecimal)
  • h: Código hash (como hexadecimal)
Java SE5 también ha tomado prestado de C la idea de sprintf(), que es un método que se utiliza para crear cadenas de caracteres. String.format() es un método estático que toma los mismos argumentos que el método format() de Formatter pero devuelve un objeto String.
Ver ejemplo: Main02.java

Expresiones regulares

Las expresiones regulares son herramientas de procesamiento de texto muy potentes y flexibles. Nos permiten especificar patrones complejos de texto que pueden buscarse en una cadena de entrada. Proporcionan un lenguaje compacto y dinámico que puede emplearse para resolver todo tipo de tareas de procesamiento, comparación, selección, edición y verificación de cadenas de una forma general.
La forma más simple de utilizar las expresiones regulares consiste en utilizar la funcionalidad incluida dentro de la clase String. Esta clase permite realizar búsquedas (matches()), partir la cadena (split()) y realizar sustituciones (replaceFirst() o replaceAll()).
Ver ejemplo: Main03.java

En general, lo que se hace es compilar objetos de expresión regular en lugar de emplear las utilidades String, que son bastante limitadas. Para ello, se debe importar la librería java.util.regex, y luego compilar una expresión regular utilizando el método estático Pattern.compile(). Esto genera un objeto Pattern basado en su argumento String. Para utilizar el objeto Pattern, lo que se hace es invocar el método matcher(), pasándole la cadena de caracteres que se quiere buscar. Este método genera un objeto Matcher, el cual tiene muchas operaciones para trabajar con cadenas.
  • public boolean matches(): Devolverá true solo si el patrón se corresponde con la cadena de entrada completa.
  • public boolean lookingAt(): Devolverá true solo si la cadena de entrada, comenzando por el principio, permite establecer una correspondencia con el patrón.
  • public boolean find(): Puede utilizarse para descubrir múltiples correspondencias de patrón en el objeto CharSequence al cuál se aplique. Es como un iterador, que se desplaza hacia adelantea través de la cadena de caracteres de entrada.
  • public boolean find(int start): El argumento indica en qué posición de la cadena debe comenzar la búsqueda.
  • public String group(): Devuelve la correspondencia completa de la operación anterior de establecimiento de correspondencias (find()).
Ver ejemplo: Main04.java

Clase Scanner

Otra característica agregada en Java SE5 es la clase Scanner. Dicha clase permite eliminar buena parte de la complejidad relacionada con el análisis de una entrada. Esta entrada puede ser tanto un archivo como un flujo de datos. El constructor de Scanner admite casi cualquier tipo de objeto de entrada, File, InputStream, String o un objeto que implemente la interface Readable. Con Scanner, los pasos de entrada, extracción de elementos y análisis sintáctico están implementados mediante diferentes tipos de métodos. El método next() devuelve el siguiente elemento String y existen métodos similares para todos los tipos primitivos (excepto char), como para también para los tipos BigDecimal y BigInteger. También existen los métodos “hasNext” correspondientes que devuelven true si el siguiente elemento de entrada es del tipo correcto.
De manera predeterminada, un objeto Scanner divide los elementos de entrada según los caracteres de espaciados, pero también podemos especificar nuestro patrón delimitador en forma de expresión regular a través del método useDelimiter().
Ver ejemplo: Main05.java

0 comentarios:



Publicar un comentario en la entrada

Este blog dejo de ser mantenido el día 12/02/2010. Para cualquier consulta o comentario realizarlo a través del sitio http://onj2ee.blogspot.com/