4th Ed Chapter 9 - 1
Capitulo 9
Caracteres y Cadenas (Strings)
4th Ed Chapter 9 - 2
Objetivos
– Declarar y usar del tipo char.– Escribir programas que procesen cadenas usando
objetos String, StringBuilder y StringBuffer.– Diferenciar las 3 clases de string y usar la clase
correcta de acuerdo a la tarea.– Especificar expresiones regulares para buscar un
patrón en una cadena.– Usar las clases Pattern y Matcher.– Comparar objetos String correctamente.
4th Ed Chapter 9 - 3
Caracteres
• En Java, los caracteres simples son representados usando el tipo de dato char.
• Los caracteres constantes se escriben como símbolos encerrados con comillas simples ‘’. Ej ‘a’
• Los caracteres son almacenados en la mem de la computadora usando algún tipo de codificación.
• ASCII, (American Standard Code for Information Interchange), es uno de códigos ampliamente usados. Total 128 caracteres (7bits) , permite representar los símbolos del lenguaje inglés.
• Java usa Unicode, que incluye ASCII, permite representar más caracteres.Total de símbolos 34148, ocupa 2 bytes
4th Ed Chapter 9 - 4
Código ASCII
Ej, el caracter 'O' es 79 (fila 70 + columna 9 = 79).
Ej, el caracter 'O' es 79 (fila 70 + columna 9 = 79).
O
9
70
4th Ed Chapter 9 - 5
Código Unicode
• El Unicode Worldwide Character Standard (Unicode) permite el intercambio, procesamiento y visualización de textos escritos en diversos lenguajes.
• Java usa el estándar Unicode para representar caracteres.
• Los char se declaran igual que otros tipos primitivos
char ch1 = 'X';
System.out.println(ch1);System.out.println( (int) ch1);
X88
4th Ed Chapter 9 - 6
Procesando Caracteres
Declaración e inicialización
Declaración e inicialización
char ch1, ch2 = ‘X’;
Conversión de tipo entre int y char.
Conversión de tipo entre int y char.
System.out.print("ASCII code of character X is " + (int) 'X' );
System.out.print("Character with ASCII code 88 is " + (char)88 );
Esta comparación devuelve verdadero porque el valor ASCII de 'A' es 65 mientras que el de 'c' es 99.
Esta comparación devuelve verdadero porque el valor ASCII de 'A' es 65 mientras que el de 'c' es 99.
‘A’ < ‘c’
4th Ed Chapter 9 - 7
Strings (cadenas)
• Una cadena es una secuencia de caracteres que se trata como un valor simple
• Se usan Instancias de la clase String para representar cadenas en Java.
• Ya vimos los métodos : substr: obtener una subcadena
length: tamaño del String
indexOf: índice de un caracter• Podemos acceder a caracteres individuales de una cadena
llamando al método charAt.
4th Ed Chapter 9 - 8
Accediendo a Elemento Individuales
• El método charAt permite acceder a un carácter dentro de un String.
0 1 2 3 4 5 6
S u m a t r a
String name = "Sumatra";
nameEsta variable se refiere a toda la cadena.
Esta variable se refiere a toda la cadena.
name.charAt( 3 )El método devuelve el caracter de la posición 3.
El método devuelve el caracter de la posición 3.
4th Ed Chapter 9 - 9
Ej: Contando vocales
char letter;
String name = JOptionPane.showInputDialog(null,“Su nombre:");
int numberOfCharacters = name.length();
int vowelCount = 0;
for (int i = 0; i < numberOfCharacters; i++) {
letter = name.charAt(i);
if ( letter == 'a' || letter == 'A' ||
letter == 'e' || letter == 'E' ||
letter == 'i' || letter == 'I' ||
letter == 'o' || letter == 'O' ||
letter == 'u' || letter == 'U' )
{
vowelCount++;
}
}
System.out.print(name + ", tiene " + vowelCount + " vocales");
Este código cuenta el número de vocales de una cadena ingresada por el usuario.
Este código cuenta el número de vocales de una cadena ingresada por el usuario.
4th Ed Chapter 9 - 10
Ej: Contando palabras ‘Java’
int javaCount = 0;
boolean repeat = true;
String word;
while ( repeat ) {
word = JOptionPane.showInputDialog(null,"Next word:");
if ( word.equals("STOP") ) {
repeat = false;
} else if ( word.equalsIgnoreCase("Java") ) {
javaCount++;
}
}
Continua leyendo palabras y cuenta cuántas veces se ingresa java ignorando mayúsculas y minúsculas.
Continua leyendo palabras y cuenta cuántas veces se ingresa java ignorando mayúsculas y minúsculas.
Notar cómo se compara. No se usa el operador == .
Notar cómo se compara. No se usa el operador == .
4th Ed Chapter 9 - 11
Operadores útiles de String
Método Significado
compareTo Compara dos cadenas da entero menor 0 si el objeto string es menor (en orden alfabético) que el string dado, cero si son iguales, y mayor que cero si el objeto string es mayor que el string dado. str1.compareTo( str2 )
substring Extrae una subcadena de una cadena ej desde la posic 1 a la posic 4
str1.substring( 1, 4 )
trim Remueve los espacios en el principio y fin
str1.trim( )
valueOf Convierte un valor de dato primitivo a cadena.String.valueOf( 123.4565 )
startsWith Devuelve verdadero si la cadena comienza con el prefijo dadostr1.startsWith( str2 )
endsWith Devuelve verdadero si la cadena termina con el prefijo dadostr1.endsWith( str2 )
4th Ed Chapter 9 - 12
Patrones Ej de patrón
• Suponga que los estudiantes se codifican con tres dígitos :– El 1er dígito representa el área (ej 5 indica computación);– El 2do indica si es del estado (1), de otro estado (2), extranjero (3);– El 3ro dígito indica los edificios dentro del campus:
• Los edificios se numeran del 1-7.
• Los estudiantes que viven fuera del campus se representan con 8.
El patrón de 3 dígitos para representar a los estudiantes de computación que viven en el campus es :
5[123][1-7]
1er caracter es 5
2do caracter
es 1, 2, or 3
3er caractercualquier digito
entre 1 y 7
4th Ed Chapter 9 - 13
Expresiones Regulares: patrones
• Se usan para buscar y reeplazar texto • Permiten expresar un conjunto de palabras (o secuencias
de símbolos) en forma reducida- Se usan símbolos especiales para formular las
expresiones regulares.
Simbolo Significado [] elección* secuencia de 0 o más ocurrencias+ secuencia de 1 o más ocurrencias^ negación- rango() y | rango de elección de caracteres múltiples
4th Ed Chapter 9 - 14
Ej de Expresiones Regulares
Expresión Descripción[013] Un sólo dígito 0, 1, or 3.
[0-9][0-9] Cualquier num de dos dígitos 00 to 99.
[0-9&&[^4567]] Un sólo dígito 0, 1, 2, 3, 8, or 9.
[a-z0-9] Un caracter en minúscula o un dígito.
[a-zA-z][a-zA-Z0-9_$]*
Un identificador Java, consistente de un caracter alphanumérico, subrayado, signo dolar, siendo el primer caracter una letra.
[wb](ad|eed) Coincide con wad, weed, bad y beed.
(AZ|CA|CO)[0-9][0-9] Coincide con AZxx,Caxx y COxx, dónde x es un sólo dígito.
4th Ed Chapter 9 - 15
Notacion de repeticion de patrones
• Tambien se puede designar una secuencia de longitud fija.
• Ej para designar cuatro dígitos: [0-9]{4}• donde el numero contenido en {} es la cantidad de
repeticiones.• Se puede especificar un rango• [....] {n} repetir el patrón exactamente n veces• [....] {n, } “ “ al menos “• [....] {n,m} “ “ al menos n pero no
más de m veces
4th Ed Chapter 9 - 16
Método Match
El método de la clase String es muy similar al método equals
ej dado un string strstr.equals(“Hola”); y str.match(“Hola”);devuelven ambos true si str es el string “Hola”pero el argumento de match puede ser un patrón lo
cual dá más flexibilidad. matches(String regex)
devuelve verdadero si este string contiene la expresión regular dada, falso caso contrario
4th Ed Chapter 9 - 17
Pattern Matches: identificadores válidos
import javax.swing.*;class MatchIdentificadoresJava{ private static final String Parar = “PARAR”; private static final String VALID = “Identif Valido”; private static final String INVALID = “Identif Invalido”; private static final String PATRON_VALIDO= “ [a-zA-Z][a-zA-Z0-
9_$]*”; public static void main (String [] arg){ String str, resp; while (true){ str = JOptionPane.showInputDialog(null, “Identificador: ”); if (str.equals(“PARAR”) ) break; if (str.matches(PATRON_VALIDO)) { resp = VALID; else resp = INVALID;}
JOptionPane.showMessageDialog(null, str + “:\n ” + resp); }}}
* => 0 o más veces
4th Ed Chapter 9 - 18
El método replaceAll
• El método replaceAll reemplaza todas las ocurrencias de una subcadena que coincide con una expresión regular dada .
String originalText, modifiedText;
originalText = ...; //assign string
modifiedText = originalText.replaceAll("[aeiou]","@");
Reemplaza todas las vocales minúsculas con el símbolo @
4th Ed Chapter 9 - 19
Ej replaceAll
Cambiar todas las ocurrencias de OOP por Prog. orientada a objetos:
str.replaceAll (“OOP”, “Prog. orientada a objetos”)
Reemplazar los nros de seguro social por xxx-xx-xxxx
str.replaceAll( “[0-9]{3} [0-9]{2} [0-9]{4}”, “xxx-xx-xxxx”)
Reemp. todas las ocurrencia de una secuencias que tiene 2 o más letras O por OO
str.replaceAll(“O{2,}”, “OO”);
4th Ed Chapter 9 - 20
• Si se ejecuta str.replaceAll (“ante”, “antes”); • reemplazara palabras como “antepasado” por “antespasado”para especificar que sólo modifique cuando coincide
con la palabra entera (no parte de ella) : \bstr.replaceAll(\\bantes\\b, “antes”); el símbolo \ en un string representa un caracter de
control tal como \n \t \r para que interprete \bantes\b como un string se
usa \ adicionales \\bantes\\b
4th Ed Chapter 9 - 21
Usos del caracter \ de escape
El caracter de escape se emplea taa para otros símbolos usados en los patrones. Ej + *
Si deseamos buscar el signo + en un texto usamos \+ y para expresarlo como un string \\+
Ej Reemplazar todas las ocurrencias de C y C++ con java (no necesariamente toda la palabra)
str.replaceAll (“(C|C\\+\\+)”, “Java”);
4th Ed Chapter 9 - 22
Signos usados con frecuencia en patrones
\d “\\d” Un digito equivale a [0-9]
\D “\\D” No digito equivale a [^0-9]
\s “\\s” Caracter blanco, espacio, tab, etc
\S “\\S” caracter no blanco
\w “\\w” caracter de palabra eq.a [1-zA-Z_0-9]
\W “\\W” caracter no de palabra
\b “\b” limite de palabra: espacio en blanco o sg puntuacion
\B “\\B” No limite de palabra
4th Ed Chapter 9 - 23
Las clases: Pattern y Matcher
• Los métodos matches y replaceAll de la clase String son atajos al uso de las clases Pattern y Matcher del paquete java.util.regex.
• Si str y regex son objetos String, entonces
str.matches(regex);
equivale a
Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(str);matcher.matches();
4th Ed Chapter 9 - 24
El método compile
• El método compile de la clase Pattern convierte una expresión regular al formato interno para llevar a cabo una operación de comparación de patrones.
• Esta conversión se lleva a cabo cada vez que se ejecuta el método matches de la clase String, por eso es más eficiente usar el método compile cuando investigamos el mismo patrón varias veces.
• Ej de programas: Ch9MatchJavaIdentifier2 y Ch9PMCountJava
4th Ed Chapter 9 - 25
Compile se ejecuta sólo una vez, queda fuera el loop
public static void main (String[] args) { String str, reply; Matcher matcher; Pattern pattern =
Pattern.compile(VALID_IDENTIFIER_PATTERN); while (true) { str = JOptionPane.showInputDialog(null, "Identifier:"); if (str.equals(STOP)) break; matcher = pattern.matcher(str); if (matcher.matches()) { reply = VALID; } else { .............
4th Ed Chapter 9 - 26
Cuántas veces está una palabra
public static void main (String[] args) { String document; int javaCount = 0; Matcher matcher; Pattern pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE); document = JOptionPane.showInputDialog(null,
"Sentencia:"); matcher = pattern.matcher(document); while (matcher.find()) { javaCount++; } JOptionPane.showMessageDialog(null,“La palabra 'java'
ocurrio " + javaCount + " veces");
4th Ed Chapter 9 - 27
El método find
• El método find es otro método potente de la clase Matcher– Busca la próxima ocurrencia de una cadena que
coincida con el patrón, devuelve verdadero si se encuentra el patrón
• Cuando se encuentra, podemos obtener el lugar de la secuencia con los métodos start y end métodos.
4th Ed Chapter 9 - 28
Posicion comienzo y fin
Ej.
matcher = pattern.matcher(docu);
while (matcher.find()) { System.out.println(docu.substring(matcher.start(),
matcher.end()) + " encontrado en la posic "
+ matcher.start());
}
4th Ed Chapter 9 - 29
La clase String es Inmutable
• En Java un objeto String es inmutable– Significa que una vez que se crea un objeto string, no
puede cambiarse, no se puede cambiar un caracter por otro, remover caracteres, etc
– Los método que usamos hasta ahora no cambian al string original, crean un nuevo objeto. Por ej. Substring crea un nuevo objeto String a partir de otro dado.
– Incluso cuando hacemos str = str1 + str2
• La clase String se define de esta forma por razones de eficiencia.
4th Ed Chapter 9 - 30
Efectos de la Inmutabilidadty
Podemos hacer esto pues los String son inmutables
4th Ed Chapter 9 - 31
La clase StringBuffer
• En muchas aplicaciones que procesan cadenas, deseamos cambiar el contenido, es decir, necesitamos que sea mutable
• Podemos modificar el contenido de una cadena empleando la clase StringBuffer
• Por ej, para concatenar cadenas, eliminar una parte de una cadena, reemplazar caracteres, etc
4th Ed Chapter 9 - 32
Ej StringBuffer
StringBuffer word = new StringBuffer("Java");word.setCharAt(0, 'D');word.setCharAt(1, 'i');
Cambiar la cadena Java a Diva
word
: StringBuffer
Java
Antes
word
: StringBuffer
Diva
Despues
4th Ed Chapter 9 - 33
Ej procesamiento
Reeplazar todas las vocales de una sentencia con ‘X’.
char letter;
String inSentence = JOptionPane.showInputDialog(null, "Sentence:");
StringBuffer tempStringBuffer = new StringBuffer(inSentence);int numberOfCharacters = tempStringBuffer.length();
for (int index = 0; index < numberOfCharacters; index++) {
letter = tempStringBuffer.charAt(index);
if (letter == 'a' || letter == 'A' || letter == 'e' || letter == 'E' ||
letter == 'i' || letter == 'I' || letter == 'o' || letter == 'O' ||
letter == 'u' || letter == 'U' ) {
tempStringBuffer.setCharAt(index,'X');}
}
JOptionPane.showMessageDialog(null, tempStringBuffer );
4th Ed Chapter 9 - 34
Los métodos append e insert
• Podemos usar el método append para agregar a un objeto String o StringBuffer al final de un objeto StringBuffer. – El método puede tambien tomar un argumento de tipo
de dato primitivo.– Cualquier tipo de dato primitivo es convertido a un
String antes de que se pasarlo al objeto StringBuffer.
• Tambien podemos agregar una cadena en una posición específica usando el método insert.
4th Ed Chapter 9 - 35
La clase StringBuilder
• Esta clase es nueva de Java 5.0 (SDK 1.5)• Se agregó esta clase en la última versión para mejorar la
performance de la clase StringBuffer.• StringBuffer y StringBuilder soportan los mismos métodos,
de manera que son intercambiables.• Hay casos avanzados donde se debe usar StringBuffer, en
los ejemplos dados aquí se puede intercambiar a StringBuilder.
• Si no es importante la performance y ya que StringBuffer se puede usar en todas las versiones de Java usar StringBuffer
4th Ed Chapter 9 - 36
Problema: Concordancia de documentos
Escribir una aplicación que de la concordancia de palabras dentro de un documento:
La salida es una lista ordenada alfabéticamente de todas las palabras de un documento y el número de veces que ocurren
El documento es un archivo de texto y la salida se graba en otro archivo
4th Ed Chapter 9 - 37
Plan General
• Tareas en pseudocodigo:
while ( Se desea procesar otro archivo) {
Tarea 1: leer el archivo;
Tarea 2: construir la lista de palabras;
Tarea 3: guardar la lista en un archivo;}
4th Ed Chapter 9 - 38
Documento de Diseño
Clase PropósitoCh9WordConcordanceMain La clase principal que implementa el control
Ch9WordConcordance Clase clave del programa. Una instancia de esta clase maneja otros objetos para construir la lista de palabras.
FileManager Una clase de ayuda para abrir un archivo y grabar los resultados, los detalles se ven en el cap 12.
WordList Otra clase de ayuda, para mantener la lista de palabras, los detalles se ven en el cap 10
Pattern/Matcher Clase para operaciones de coincidencia de patrones.
4th Ed Chapter 9 - 39
Relación entre las Clases
FileManger
Ch9WordConcordance
Matcher
WordList
Pattern
Ch9WordConcordanceMain
(main class)
clase a implementar
clase de dada
4th Ed Chapter 9 - 40
Desarrollo
• Desarrollaremos en 4 pasos:
1. Comenzar con el esqueleto del prorama. Definir la clase principal y sus datos miembro. Comenzar con una clase rudimentaria Ch9WordConcordance.
2. Agregar código para abrir y grabar los resultados Extender las clases existentes de acuerdo a las necesidades.
3. Completar la implementación de la clase Ch9WordConcordance.
4. Finalizar el código removiendo las sentencias temporales.
4th Ed Chapter 9 - 41
Paso 1 Diseño
• Definir el esqueleto de la clase principal
• Definir el esqueleto de la clase Ch9WordConcordance class, por ahora solo tendra un constructor sin argumentos
4th Ed Chapter 9 - 42
Step 1 Code
Directory: Chapter9/Step1
Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java
Directory: Chapter9/Step1
Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java
Program source file is too big to list here. From now on, we askyou to view the source files using your Java IDE.
4th Ed Chapter 9 - 43
Paso 1 Prueba
• Verificar que el constructor se ejecute correctamente
• y que el control de repetición en el método start trabaje como esta planificado
4th Ed Chapter 9 - 44
Paso 2 Diseño
• Agregar rutinas para el manejo I/O de archivos• La tarea la va a hacer la clase FileManager, necesitamos
ver como usar correctamente esta clase.• La clase FileManager tiene dos métodos : openFile y
saveFile.• Hay dos implementaciones de saveFile, usar un arch por
defecto output1.txt o permitir al usuario que elija el arch usando un cuadro de dialogo.
• caso 1 : FileManager fm = new FileManager();
String doc = ......
fm.saveFile (“output1.txt”, doc);
caso 2: fm.saveFile (doc);
4th Ed Chapter 9 - 45
Step 2 Code
Directory: Chapter9/Step2
Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java
Directory: Chapter9/Step2
Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java
4th Ed Chapter 9 - 46
Paso 2 Prueba
• probar que se abran los archivos y los muestre por la terminal, System.out.
• Verificar la rutina de salida, que se grabe el archivo de salida con el nombre indicado editar con un editor de texto
• La salida la crea el método build de Ch9WordConcordance,es temporal aún
4th Ed Chapter 9 - 47
Paso 3 Diseño
• Completar el método build de la clase Ch9WordConcordance
• Usaremos la 2da clase de ayuda WordList• El método clave de esta clase es el método add
que inserta la palabra dada dentro de la lista de palabras
4th Ed Chapter 9 - 48
Step 3 Code
Directory: Chapter9/Step3
Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java
Directory: Chapter9/Step3
Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java
4th Ed Chapter 9 - 49
Step 3 Probar
• Correr el programa empleando distintos archivos de texto
• Podemos emplear algún archivo largo • Taa archivos creados a propósito con
palabras repetidas para ver si las cuenta en forma correcta
• Usar un archivo vacío.