Download Chapter 9
Document related concepts
no text concepts found
Transcript
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