Capitulo 9

of 49 /49
4 th Ed Chapter 9 - 1 Capitulo 9 Caracteres y Cadenas (Strings)

Embed Size (px)

description

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 . - PowerPoint PPT Presentation

Transcript of Capitulo 9

  • Capitulo 9Caracteres y Cadenas (Strings)

  • ObjetivosDeclarar 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 patrn en una cadena.Usar las clases Pattern y Matcher.Comparar objetos String correctamente.

  • CaracteresEn Java, los caracteres simples son representados usando el tipo de dato char.Los caracteres constantes se escriben como smbolos encerrados con comillas simples . Ej aLos caracteres son almacenados en la mem de la computadora usando algn tipo de codificacin.ASCII, (American Standard Code for Information Interchange), es uno de cdigos ampliamente usados. Total 128 caracteres (7bits) , permite representar los smbolos del lenguaje ingls. Java usa Unicode, que incluye ASCII, permite representar ms caracteres.Total de smbolos 34148, ocupa 2 bytes

  • Cdigo ASCII

  • Cdigo UnicodeEl Unicode Worldwide Character Standard (Unicode) permite el intercambio, procesamiento y visualizacin de textos escritos en diversos lenguajes.Java usa el estndar Unicode para representar caracteres.Los char se declaran igual que otros tipos primitivos

  • Procesando Caracteres

  • Strings (cadenas)Una cadena es una secuencia de caracteres que se trata como un valor simpleSe usan Instancias de la clase String para representar cadenas en Java.Ya vimos los mtodos : substr: obtener una subcadena length: tamao del String indexOf: ndice de un caracterPodemos acceder a caracteres individuales de una cadena llamando al mtodo charAt.

  • Accediendo a Elemento IndividualesEl mtodo charAt permite acceder a un carcter dentro de un String.

  • Ej: Contando vocales

  • Ej: Contando palabras Java Continua leyendo palabras y cuenta cuntas veces se ingresa java ignorando maysculas y minsculas.

  • Operadores tiles de String

    Mtodo SignificadocompareToCompara dos cadenas da entero menor 0 si el objeto string es menor (en orden alfabtico) 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 )substringExtrae una subcadena de una cadena ej desde la posic 1 a la posic 4 str1.substring( 1, 4 )trimRemueve los espacios en el principio y fin str1.trim( )valueOfConvierte un valor de dato primitivo a cadena. String.valueOf( 123.4565 )startsWithDevuelve verdadero si la cadena comienza con el prefijo dadostr1.startsWith( str2 )endsWithDevuelve verdadero si la cadena termina con el prefijo dadostr1.endsWith( str2 )

  • Patrones Ej de patrnSuponga que los estudiantes se codifican con tres dgitos :El 1er dgito representa el rea (ej 5 indica computacin);El 2do indica si es del estado (1), de otro estado (2), extranjero (3);El 3ro dgito 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 patrn de 3 dgitos para representar a los estudiantes de computacin que viven en el campus es :5[123][1-7]

  • Expresiones Regulares: patronesSe usan para buscar y reeplazar texto Permiten expresar un conjunto de palabras (o secuencias de smbolos) en forma reducidaSe usan smbolos especiales para formular las expresiones regulares.

    SimboloSignificado []eleccin* secuencia de 0 o ms ocurrencias+ secuencia de 1 o ms ocurrencias^ negacin- rango() y |rango de eleccin de caracteres mltiples

  • Ej de Expresiones Regulares

  • Notacion de repeticion de patronesTambien se puede designar una secuencia de longitud fija.Ej para designar cuatro dgitos: [0-9]{4}donde el numero contenido en {} es la cantidad de repeticiones.Se puede especificar un rango[....] {n} repetir el patrn exactamente n veces[....] {n, } al menos [....] {n,m} al menos n pero no ms de m veces

  • Mtodo MatchEl mtodo de la clase String es muy similar al mtodo equals ej dado un string strstr.equals(Hola); y str.match(Hola);devuelven ambos true si str es el string Holapero el argumento de match puede ser un patrn lo cual d ms flexibilidad. matches(Stringregex) devuelve verdadero si este string contiene la expresin regular dada, falso caso contrario

  • Pattern Matches: identificadores vlidos 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 ms veces

  • El mtodo replaceAllEl mtodo replaceAll reemplaza todas las ocurrencias de una subcadena que coincide con una expresin regular dada .Reemplaza todas las vocales minsculas con el smbolo @

  • Ej replaceAllCambiar 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 ms letras O por OOstr.replaceAll(O{2,}, OO);

  • Si se ejecuta str.replaceAll (ante, antes); reemplazara palabras como antepasado por antespasadopara especificar que slo modifique cuando coincide con la palabra entera (no parte de ella) : \bstr.replaceAll(\\bantes\\b, antes); el smbolo \ 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

  • Usos del caracter \ de escapeEl caracter de escape se emplea taa para otros smbolos 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);

  • Signos usados con frecuencia en patrones

  • Las clases: Pattern y MatcherLos mtodos 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();

  • El mtodo compileEl mtodo compile de la clase Pattern convierte una expresin regular al formato interno para llevar a cabo una operacin de comparacin de patrones. Esta conversin se lleva a cabo cada vez que se ejecuta el mtodo matches de la clase String, por eso es ms eficiente usar el mtodo compile cuando investigamos el mismo patrn varias veces. Ej de programas: Ch9MatchJavaIdentifier2 y Ch9PMCountJava

  • Compile se ejecuta slo 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 { .............

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

  • El mtodo findEl mtodo find es otro mtodo potente de la clase MatcherBusca la prxima ocurrencia de una cadena que coincida con el patrn, devuelve verdadero si se encuentra el patrnCuando se encuentra, podemos obtener el lugar de la secuencia con los mtodos start y end mtodos.

  • Posicion comienzo y finEj.

    matcher = pattern.matcher(docu); while (matcher.find()) { System.out.println(docu.substring(matcher.start(), matcher.end()) + " encontrado en la posic " + matcher.start()); }

  • La clase String es InmutableEn Java un objeto String es inmutableSignifica que una vez que se crea un objeto string, no puede cambiarse, no se puede cambiar un caracter por otro, remover caracteres, etcLos mtodo 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 + str2La clase String se define de esta forma por razones de eficiencia.

  • Efectos de la InmutabilidadtyPodemos hacer esto pues los String son inmutables

  • La clase StringBufferEn 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

  • Ej StringBufferCambiar la cadena Java a Diva

  • Ej procesamientoReeplazar todas las vocales de una sentencia con X.

  • Los mtodos append e insertPodemos usar el mtodo append para agregar a un objeto String o StringBuffer al final de un objeto StringBuffer. El mtodo 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 posicin especfica usando el mtodo insert.

  • La clase StringBuilder Esta clase es nueva de Java 5.0 (SDK 1.5)Se agreg esta clase en la ltima versin para mejorar la performance de la clase StringBuffer.StringBuffer y StringBuilder soportan los mismos mtodos, 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

  • Problema: Concordancia de documentos

    Escribir una aplicacin que de la concordancia de palabras dentro de un documento:La salida es una lista ordenada alfabticamente de todas las palabras de un documento y el nmero de veces que ocurren El documento es un archivo de texto y la salida se graba en otro archivo

  • Plan GeneralTareas en pseudocodigo:

  • Documento de Diseo

    ClasePropsitoCh9WordConcordanceMainLa clase principal que implementa el controlCh9WordConcordanceClase clave del programa. Una instancia de esta clase maneja otros objetos para construir la lista de palabras.FileManagerUna clase de ayuda para abrir un archivo y grabar los resultados, los detalles se ven en el cap 12.WordListOtra clase de ayuda, para mantener la lista de palabras, los detalles se ven en el cap 10Pattern/MatcherClase para operaciones de coincidencia de patrones.

  • Relacin entre las Clasesclase a implementarclase de dada

  • DesarrolloDesarrollaremos en 4 pasos:

    Comenzar con el esqueleto del prorama. Definir la clase principal y sus datos miembro. Comenzar con una clase rudimentaria Ch9WordConcordance.Agregar cdigo para abrir y grabar los resultados Extender las clases existentes de acuerdo a las necesidades.Completar la implementacin de la clase Ch9WordConcordance.Finalizar el cdigo removiendo las sentencias temporales.

  • Paso 1 DiseoDefinir el esqueleto de la clase principal

    Definir el esqueleto de la clase Ch9WordConcordance class, por ahora solo tendra un constructor sin argumentos

  • Step 1 CodeDirectory: Chapter9/Step1

    Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.javaProgram source file is too big to list here. From now on, we askyou to view the source files using your Java IDE.

  • Paso 1 PruebaVerificar que el constructor se ejecute correctamente y que el control de repeticin en el mtodo start trabaje como esta planificado

  • Paso 2 DiseoAgregar rutinas para el manejo I/O de archivosLa tarea la va a hacer la clase FileManager, necesitamos ver como usar correctamente esta clase.La clase FileManager tiene dos mtodos : 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);

  • Step 2 CodeDirectory: Chapter9/Step2

    Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java

  • Paso 2 Pruebaprobar 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 textoLa salida la crea el mtodo build de Ch9WordConcordance,es temporal an

  • Paso 3 DiseoCompletar el mtodo build de la clase Ch9WordConcordanceUsaremos la 2da clase de ayuda WordListEl mtodo clave de esta clase es el mtodo add que inserta la palabra dada dentro de la lista de palabras

  • Step 3 CodeDirectory: Chapter9/Step3

    Source Files: Ch9WordConcordanceMain.java Ch9WordConcordance.java

  • Step 3 ProbarCorrer el programa empleando distintos archivos de textoPodemos emplear algn archivo largo Taa archivos creados a propsito con palabras repetidas para ver si las cuenta en forma correctaUsar un archivo vaco.

    We will cover the basic string processing in this lesson, manipulating char and String data.Characters can be stored in a computer memory using the ASCII encoding. The ASCII codes range from 0 to 127. The character 'A' is represented as 65, for example. The ASCII values from 0 to 32 are called nonprintable control characters. For example, ASCII code 04 eot stands for End of Transmission. We can use this character to signal the end of transmission of data when sending data over a communication line.

    ASCII works well for English-language documents because all characters and punctuation marks are included in the ASCII codes. But ASCII codes cannot be used to represent character sets of other languages. To overcome this limitation, unicode encoding was proposed. Unicode uses two bytes to represent characters and adopts the same encoding for the first 127 values as the ASCII codes.

    Encoding value of a character can be accessed by converting it to an int as the sample code illustrates.We introduced the String class in Chapter 2. We will study additional String methods.This sample code counts the number of vowels in a given input.

    Using the toUpperCase method, that converts all alphabetic characters to uppercase, we can rewrite the code as

    char letter;String name = inputBox.getString("What is your name?");int numberOfCharacters = name.length();int vowelCount= 0;StringnameUpper = name.toUpperCase();

    for (int i = 0; i < numberOfCharacters; i++) {

    letter = nameUpper.charAt(i);

    if (letter == 'A' ||letter == 'E' ||letter == 'I' ||letter == 'O' ||letter == 'U' ) { vowelCount++;}}

    System.out.print(name + ", your name has " + vowelCount + " vowels");This sample code counts the number of times the word 'Java' is entered.

    Notice that we wroteword.equals( STOP)

    not word == STOP

    We described the differences in Lesson 5-2. In this situation, we need to use 'equals' because we are testing whether two String objects have the same sequence of characters.

    Here are some examples:

    String str1 = Java, str2 = Wow ;

    str1.compareTo( Hello ); //returns positive integer //because str1 >= Hellostr1.substring( 1, 4 ); //returns ava

    str2.trim( ) //returns Wow, str2 stays same

    str1.startsWith( Ja ); //returns true

    str1.endsWith( avi ); //returns false

    We can use a pattern to represent a range of valid codes succintly. Without using the sample 3-digit pattern for computer science majors living on-campus, we must spell out 21 separate codes.Regular expression allows us to express a large set of words (any sequence of symbols) succinctly. We use specially designated symbols such as the asterisk to formulate regular expressions.- Los corchetes [ ] representan eleccin Para indicar una secuencia de longitud no limitada: smbolo asterisco * significa 0 o ms ocurrencias el signo ms + significa 1 o ms ocurrencias. El smbolo ^ significa negacin.El smbolo significa rango. Los parntesis ( ) y la barra | significa un rango de eleccin de caracteres mltiples.

    Here are some examples of regular expressions.Cambios a realizar al codigo empleando matcher y pattern en vez de invocar al mtodo matches de String

    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 { reply = INVALID; }

    JOptionPane.showMessageDialog(null, str + ":\n" + reply); }The start method returns the position in the string where the first character of the pattern is found.

    The end method returns the value 1 more than the position in the string where the last character of the pattern is found.

    By making String objects immutable, we can treat it much like a primitive data type for efficient processing. If we use the new operator to create a String object, a separate object is created as the top diagram illustrates. If we use a simple assignment as in the bottom diagram, then all literal constants refer to the same object. We can do this because String objects are immutable. If the situation calls for directing changing the contents of a string, then we use the StringBuffer class.This sample code illustrates how the original string is changed. Notice that the String class does not include the setCharAt method. The method is only defined in the mutable StringBuffer class.Se podria usar

    nameUpper = name.toUpperCase();

    Notice how the input routine is done. We are reading in a String object and converting it to a StringBuffer object, because we cannot simply assign a String object to a StringBuffer variable. For example, the following code is invalid:

    StringBuffer strBuffer = inputBox.getString( );

    We are required to create a StringBuffer object from a String object as in

    String str = "Hello";StringBuffer strBuf = new StringBuffer( str );

    You cannot input StringBuffer objects. You have to input String objects and convert them to StringBuffer objects.The append and insert are the two very useful methods of the StringBuffer class for string manipulation.For this application, we are given two helper classes. The FileManager class handles the file input and output. The WordList class handles the maintenance of word lists. Our responsibility is to extract the words from a given document and use the helper classes correctly.There will be a total of six key classes in this application. We will be designing two classes: Ch9WordConcordanceMain and Ch9WordConcordance. For this application, we are given two helper classes. The FileManager class handles the file input and output. The WordList class handles the maintenance of word lists. Our responsibility is to extract the words from a given document and use the helper classes correctly.

    Please use your Java IDE to view the source files and run the program.