Title: 4th Ed Chapter 9 - 1
1Capitulo 9
- Caracteres y Cadenas (Strings)
2Objetivos
- 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.
3Caracteres
- 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
4Código ASCII
5Có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
6Procesando Caracteres
7Strings (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.
8Accediendo a Elemento Individuales
- El método charAt permite acceder a un carácter
dentro de un String.
9Ej Contando vocales
10Ej Contando palabras Java
Continua leyendo palabras y cuenta cuántas veces
se ingresa java ignorando mayúsculas y minúsculas.
11Operadores útiles de String
12Patrones 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
51231-7
13Expresiones 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
-
14Ej de Expresiones Regulares
15Notacion de repeticion de patrones
- Tambien se puede designar una secuencia de
longitud fija. - Ej para designar cuatro dígitos 0-94
- 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
16Mé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
17Pattern Matches identificadores válidos
gt 0 o más veces
- 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-Za-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)
18El 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 _at_
19Ej 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-93 0-92 0-94,
xxx-xx-xxxx) - Reemp. todas las ocurrencia de una secuencias que
tiene 2 o más letras O por OO - str.replaceAll(O2,, OO)
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)
\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
21Usos 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 ((CC\\\\), Java)
22Signos usados con frecuencia en patrones
23Las 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()
24El 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
25Compile 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 .............
-
26Cuá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")
27El 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.
28Posicion 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())
-
29La 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.
30Efectos de la Inmutabilidadty
Podemos hacer esto pues los String son inmutables
31La 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
32Ej StringBuffer
Cambiar la cadena Java a Diva
33Ej procesamiento
- Reeplazar todas las vocales de una sentencia con
X.
34Los 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.
35La 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
36Problema 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
37Plan General
38Documento de Diseño
39Relación entre las Clases
clase a implementar
clase de dada
40Desarrollo
- Desarrollaremos en 4 pasos
- Comenzar con el esqueleto del prorama. Definir la
clase principal y sus datos miembro. Comenzar con
una clase rudimentaria Ch9WordConcordance. - Agregar código para abrir y grabar los resultados
Extender las clases existentes de acuerdo a las
necesidades. - Completar la implementación de la clase
Ch9WordConcordance. - Finalizar el código removiendo las sentencias
temporales.
41Paso 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
42Step 1 Code
Directory Chapter9/Step1 Source Files
Ch9WordConcordanceMain.java Ch9WordConcordance.
java
Program source file is too big to list here. From
now on, we ask you to view the source files using
your Java IDE.
43Paso 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
44Paso 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)
45Step 2 Code
Directory Chapter9/Step2 Source Files
Ch9WordConcordanceMain.java Ch9WordConcordance.
java
46Paso 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
47Paso 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
48Step 3 Code
Directory Chapter9/Step3 Source Files
Ch9WordConcordanceMain.java Ch9WordConcordance.
java
49Step 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.