1 / 49

Capitulo 9

Capitulo 9. Caract e r e s y Cadenas ( Strings ). Objetiv o s. Declar ar y usar del tipo char . Escribir programas que procesen cadenas usando objetos String, StringBuilder y StringBuffer. Diferen ciar las 3 clases de string y usar la clase correcta de acuerdo a la tarea .

saburo
Download Presentation

Capitulo 9

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Capitulo 9 Caracteres yCadenas (Strings)

  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.

  3. Caracteres • En Java, los caracteres simples son representados usando el tipo de datochar. • Los caracteres constantes se escriben como símbolos encerrados con comillas simples ‘’. Ej ‘a’ • Los caracteresson 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 usaUnicode, que incluye ASCII, permite representar más caracteres.Total de símbolos 34148, ocupa 2 bytes

  4. 9 Ej, el caracter 'O'es79 (fila70 + columna9 = 79). O 70 Código ASCII

  5. char ch1 = 'X'; System.out.println(ch1); System.out.println( (int) ch1); X 88 Código Unicode • El Unicode Worldwide Character Standard (Unicode) permite el intercambio, procesamiento y visualización de textos escritos en diversos lenguajes. • Java usael estándar Unicode para representar caracteres. • Los char se declaran igual que otros tipos primitivos

  6. Declaración e inicialización char ch1, ch2 = ‘X’; System.out.print("ASCII code of character X is " + (int)'X' ); System.out.print("Character with ASCII code 88 is " + (char)88 ); Conversión de tipo entre int y char. ‘A’ < ‘c’ Esta comparación devuelve verdadero porque el valor ASCII de'A'es 65mientras que el de 'c'es 99. Procesando Caracteres

  7. Strings (cadenas) • Una cadena es una secuencia de caracteres que se trata como un valor simple • Se usan Instancias de la clase Stringpara 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.

  8. 0 1 2 3 4 5 6 S u m a t r a String name = "Sumatra"; name.charAt( 3 ) name El método devuelve el caracter de la posición 3. Esta variable se refiere a toda la cadena. Accediendo a Elemento Individuales • El método charAt permite acceder a un carácter dentro de un String.

  9. 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. Ej: Contando vocales

  10. 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++; } } Notar cómo se compara. No se usa el operador == . Ej: Contando palabras ‘Java’ Continua leyendo palabras y cuenta cuántas veces se ingresa java ignorando mayúsculas y minúsculas.

  11. Operadores útiles de String

  12. 1er caracter es 5 3er caracter cualquier digito entre 1 y 7 2do caracter es 1, 2, or 3 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]

  13. ExpresionesRegulares: 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

  14. Ej de Expresiones Regulares

  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

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

  17. Pattern Matches: identificadores válidos * => 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-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); }}}

  18. String originalText, modifiedText; originalText = ...; //assign string modifiedText = originalText.replaceAll("[aeiou]","@"); El método replaceAll • El método replaceAllreemplaza todas las ocurrencias de una subcadena que coincide con una expresión regular dada . Reemplaza todas las vocales minúsculas con el símbolo @

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

  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

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

  22. Signos usados con frecuencia en patrones

  23. Las clases: Pattern y Matcher • Los métodos matchesy replaceAllde la clase String son atajos al uso de las clases PatternyMatcherdel 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();

  24. El método compile • El método compilede 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 matchesde la clase String,por eso es más eficiente usar el método compilecuando investigamos el mismo patrón varias veces. • Ej de programas: Ch9MatchJavaIdentifier2y Ch9PMCountJava

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

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

  27. El método find • El método findes 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 startyend métodos.

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

  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.

  30. Efectos de la Inmutabilidadty Podemos hacer esto pues los String son inmutables

  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

  32. StringBuffer word = new StringBuffer("Java"); word.setCharAt(0, 'D'); word.setCharAt(1, 'i'); word word : StringBuffer : StringBuffer Java Diva Antes Despues Ej StringBuffer Cambiar la cadena JavaaDiva

  33. 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 ); Ej procesamiento Reeplazar todas las vocales de una sentencia con ‘X’.

  34. Los métodos appende insert • Podemos usar el método appendpara 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.

  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

  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

  37. 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; } Plan General • Tareas en pseudocodigo:

  38. Documento de Diseño

  39. Ch9Word ConcordanceMain FileManger WordList (main class) Ch9Word Concordance Matcher Pattern Relación entre las Clases clase a implementar clase de dada

  40. Desarrollo • 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.

  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

  42. Step 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.

  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

  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 claseFileManagertiene dos métodos : openFileysaveFile. • 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);

  45. Step 2 Code • Directory: Chapter9/Step2 • Source Files: Ch9WordConcordanceMain.java • Ch9WordConcordance.java

  46. Paso 2Prueba • 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

  47. Paso 3 Diseño • Completar el método buildde 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

  48. Step 3 Code • Directory: Chapter9/Step3 • Source Files: Ch9WordConcordanceMain.java • Ch9WordConcordance.java

  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.

More Related