Download - Capitulo 9

Transcript
Page 1: Capitulo  9

4th Ed Chapter 9 - 1

Capitulo 9

Caracteres y Cadenas (Strings)

Page 2: Capitulo  9

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.

Page 3: Capitulo  9

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

Page 4: Capitulo  9

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

Page 5: Capitulo  9

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

Page 6: Capitulo  9

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’

Page 7: Capitulo  9

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.

Page 8: Capitulo  9

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.

Page 9: Capitulo  9

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.

Page 10: Capitulo  9

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

Page 11: Capitulo  9

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 )

Page 12: Capitulo  9

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

Page 13: Capitulo  9

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

Page 14: Capitulo  9

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.

Page 15: Capitulo  9

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

Page 16: Capitulo  9

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

Page 17: Capitulo  9

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

Page 18: Capitulo  9

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 @

Page 19: Capitulo  9

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”);

Page 20: Capitulo  9

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

Page 21: Capitulo  9

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”);

Page 22: Capitulo  9

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

Page 23: Capitulo  9

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

Page 24: Capitulo  9

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

Page 25: Capitulo  9

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

Page 26: Capitulo  9

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");

Page 27: Capitulo  9

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.

Page 28: Capitulo  9

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

}

Page 29: Capitulo  9

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.

Page 30: Capitulo  9

4th Ed Chapter 9 - 30

Efectos de la Inmutabilidadty

Podemos hacer esto pues los String son inmutables

Page 31: Capitulo  9

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

Page 32: Capitulo  9

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

Page 33: Capitulo  9

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

Page 34: Capitulo  9

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.

Page 35: Capitulo  9

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

Page 36: Capitulo  9

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

Page 37: Capitulo  9

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;}

Page 38: Capitulo  9

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.

Page 39: Capitulo  9

4th Ed Chapter 9 - 39

Relación entre las Clases

FileManger

Ch9WordConcordance

Matcher

WordList

Pattern

Ch9WordConcordanceMain

(main class)

clase a implementar

clase de dada

Page 40: Capitulo  9

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.

Page 41: Capitulo  9

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

Page 42: Capitulo  9

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.

Page 43: Capitulo  9

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

Page 44: Capitulo  9

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

Page 45: Capitulo  9

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

Page 46: Capitulo  9

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

Page 47: Capitulo  9

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

Page 48: Capitulo  9

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

Page 49: Capitulo  9

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.