Capitulo 9
Caracteres y Cadenas (Strings)
4th Ed Chapter 9 - 1
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 - 2
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 - 3
Código ASCII
9
70
O
Ej, el caracter
'O' es 79 (fila 70
+ columna 9 =
79).
4th Ed Chapter 9 - 4
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);
X
88
4th Ed Chapter 9 - 5
Procesando Caracteres
char ch1, ch2 = ‘X’;
Declaración e
inicialización
System.out.print("ASCII code of character X is " +
(int) 'X' );
System.out.print("Character with ASCII code 88 is "
+ (char)88 );
‘A’ < ‘c’
Conversión de tipo entre
int y char.
Esta comparación
devuelve verdadero
porque el valor ASCII de
'A' es 65 mientras que el
de 'c' es 99.
4th Ed Chapter 9 - 6
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 - 7
Accediendo a Elemento Individuales
• El método charAt permite acceder a un carácter dentro de
un String.
String name = "Sumatra";
0
1
2
3
4
5
6
S
u
m
a
t
r
a
name
Esta variable se refiere a
toda la cadena.
name.charAt( 3 )
El método devuelve el
caracter de la posición 3.
4th Ed Chapter 9 - 8
Ej: Contando vocales
char
letter;
String
name
int
numberOfCharacters = name.length();
int
vowelCount
= JOptionPane.showInputDialog(null,“Su nombre:");
= 0;
for (int i = 0; i < numberOfCharacters; i++) {
letter = name.charAt(i);
if (
letter == 'a' || letter == 'A' ||
Este código cuenta
el número de
vocales de una
cadena ingresada
por el usuario.
letter == 'e' || letter == 'E' ||
letter == 'i' || letter == 'I' ||
letter == 'o' || letter == 'O' ||
letter == 'u' || letter == 'U'
)
{
vowelCount++;
}
}
System.out.print(name + ", tiene " + vowelCount + " vocales");
4th Ed Chapter 9 - 9
Ej: Contando palabras ‘Java’
int
javaCount
= 0;
boolean
repeat
= true;
String
word;
Continua leyendo palabras
y cuenta cuántas veces se
ingresa java ignorando
mayúsculas y minúsculas.
while ( repeat ) {
word = JOptionPane.showInputDialog(null,"Next word:");
if ( word.equals("STOP") )
repeat = false;
{
Notar cómo se compara.
No se usa el operador == .
} else if ( word.equalsIgnoreCase("Java") ) {
javaCount++;
}
}
4th Ed Chapter 9 - 10
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
valueOf
Remueve los espacios en el principio y fin
str1.trim( )
Convierte un valor de dato primitivo a cadena.
String.valueOf( 123.4565 )
startsWith
Devuelve verdadero si la cadena comienza con el prefijo dado
str1.startsWith( str2 )
endsWith
Devuelve verdadero si la cadena termina con el prefijo dado
str1.endsWith( str2 )
4th Ed Chapter 9 - 11
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 caracter
cualquier digito
entre 1 y 7
4th Ed Chapter 9 - 12
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
[]
*
+
^
() y |
Significado
elección
secuencia de 0 o más ocurrencias
secuencia de 1 o más ocurrencias
negación
rango
rango de elección de caracteres múltiples
4th Ed Chapter 9 - 13
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-Z09_$]*
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 - 14
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 - 15
Método Match
El método de la clase String es muy similar al
método equals
ej dado un string str
str.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 - 16
Pattern Matches: identificadores válidos
import javax.swing.*;
* => 0 o más veces
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); }}}
4th Ed Chapter 9 - 17
El método replaceAll
• El método replaceAll reemplaza todas las
ocurrencias de una subcadena que coincide con
una expresión regular dada .
Reemplaza todas las vocales minúsculas con el símbolo @
String originalText, modifiedText;
originalText = ...;
//assign string
modifiedText =
originalText.replaceAll("[aeiou]","@");
4th Ed Chapter 9 - 18
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 - 19
• 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) : \b
str.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 - 20
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 - 21
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”
\B
“\\B”
limite de palabra: espacio en blanco o sg
puntuacion
No limite de palabra
4th Ed Chapter 9 - 22
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 - 23
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 - 24
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 - 25
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 - 26
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 - 27
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 - 28
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 - 29
Efectos de la Inmutabilidadty
Podemos hacer
esto pues los
String son
inmutables
4th Ed Chapter 9 - 30
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 - 31
Ej StringBuffer
word
Cambiar la cadena
Java a Diva
word
: StringBuffer
Java
Antes
: StringBuffer
Diva
Despues
StringBuffer word = new StringBuffer("Java");
word.setCharAt(0, 'D');
word.setCharAt(1, 'i');
4th Ed Chapter 9 - 32
Ej procesamiento
Reeplazar todas las vocales de una sentencia con ‘X’.
char
letter;
String
inSentence
= JOptionPane.showInputDialog(null, "Sentence:");
StringBuffer tempStringBuffer
int
= new StringBuffer(inSentence);
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 - 33
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 - 34
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 - 35
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 - 36
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 - 37
Documento de Diseño
Clase
Propósito
Ch9WordConcordanceMain
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 - 38
Relación entre las Clases
FileManger
WordList
Ch9Word
ConcordanceMain
(main class)
Ch9Word
Concordance
clase a implementar
Pattern
Matcher
clase de dada
4th Ed Chapter 9 - 39
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 - 40
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 - 41
Step 1 Code
Program source file is too big to list here. From now on, we ask
you to view the source files using your Java IDE.
Directory:
Chapter9/Step1
Source Files: Ch9WordConcordanceMain.java
Ch9WordConcordance.java
4th Ed Chapter 9 - 42
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 - 43
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 - 44
Step 2 Code
Directory:
Chapter9/Step2
Source Files: Ch9WordConcordanceMain.java
Ch9WordConcordance.java
4th Ed Chapter 9 - 45
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 - 46
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 - 47
Step 3 Code
Directory:
Chapter9/Step3
Source Files: Ch9WordConcordanceMain.java
Ch9WordConcordance.java
4th Ed Chapter 9 - 48
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.
4th Ed Chapter 9 - 49
Descargar

Chapter 9