1. ESTRUCTURA DE DATOS BÁSICAS 1.1.Cadenas o Strings Cadena: Es una secuencia finita de símbolos tomados como un conjunto de caracteres (letras, números, caracteres especiales). Strings: Internamente es un arreglo de caracteres, dependiendo del lenguaje de Programación generalmente se considera el inicio de la cadena en la posición 0. La importancia del String radica en que la mayor parte de la información que se maneja actualmente en casi cualquier área del conocimiento puede verse como una secuencia de caracteres. TDA: String Elementos: Conjunto de letras mayúsculas y minúsculas, caracteres especiales y dígitos. Estructura: Existe una relación lineal, debido a que se considera como una cadena de caracteres. Dominio: Suponiendo que los Strings pueden almacenar entre 0 y 80 caracteres, su dominio será el conjunto de todas las cadenas que puedan formar con la combinación de elementos de esa longitud. Operaciones: - I_ICIALIZAR Utilidad: Nos sirve para definir el espacio a ocupar en la memoria por el string. Datos de entrada: Tamaño de memoria para el String Datos de salida: El string S es nulo (esta vacio) Precondición: Ninguna Postcondición: el String S es nulo. - I_SERTAR_CARÁCTER_AL_FI_AL Utilidad: añadir un carácter al final Datos de entrada: String S y la letra L que se insertará al final de S. Datos de salida: String S modificado Precondición: El numero de letras en S es menor que 80. Postcondición: el string S tiene una letra más en el extremo derecho - BORRAR_ CARÁCTER_I_ICIAL - Utilidad: Permite borrar un carácter al inicio del String - Datos de entrada: String S al que se le borrara la primera letra - Datos de salida: String S modificado - Precondición: el String S exista y no sea nulo - Postcondicion: el String S tiene una letra menos en el extremo izquierdo Curso de Estructuras de Datos Orientada a Objetos 2 - CO_CATE_AR Utilidad: Unir dos Strings S1 y S2 Datos de entrada: Strings S1 y S2. Datos de salida: String S1 modificado. Precondición: La suma de la longitud de S1 y S2 debe ser menor que 80. Postcondición: A string S1 se le agrega todos los caracteres de s2(en el extremo derecho); s2 no se modifica. - BUSCAR_SUBSTRI_G Utilidad: Buscar un Substring S2 en S1 Datos de entrada: Strings S1 y S2. Datos de salida: verdadero si S2 está contenida en S1, falso en caso contrario Precondición: S1 y S2 existan Postcondición: ninguna - OBTE_ER_ CARACTER Utilidad: Sirve para encontrar un carácter dentro del String Datos de entrada: String S donde se desea conocer cierto carácter y la posición i del carácter que se desea conocer. Datos de salida: Carácter que se encuentra en la posición i del String S Precondición: El String S no sea nulo e i debe ser un valor entre 1 y la longitud de S Postcondición: Ninguna - VERIFICA_VACIO Utilidad: Sirve para verificar si una cadena o String está vacía o no Datos de entrada: String S que será verificado Datos de salida: Verdadero si el String S no tiene caracteres y Falso en caso contrario. Precondición: Ninguna. Postcondición: Ninguna. - VERIFICAR_LLE_A Utilidad: Sirve para verificar si una cadena está llena o no Datos de entrada: String S que será verificado Datos de salida: Verdadero si la cadena o String S contiene 80 caracteres y Falso en caso contrario Precondición: Ninguna Postcondición: Ninguna - I_VIERTE Utilidad: Sirve para invertir el orden de los caracteres de un String. Datos de entrada: String S1 a invertir Datos de salida: String S2 Precondición: la secuencia de la cadena S se invierte, de forma que el primer carácter toma el lugar del último, el segundo del penúltimo y así sucesivamente. Postcondición: El String S1 cambia sus caracteres y se convierte en String S2 Representación del TDA String. Se puede almacenar en la memoria mediante almacenamiento contiguo y también podrá utilizarse el almacenamiento no contiguo. 1. Uso de un Carácter Centinela Los caracteres se almacenan en un arreglo con longitud predefinida. Se delimitan por un carácter especial, denominado Centinela -equivale a un carácter nulo en la mayoría de los lenguajes de programación \0 . M A R T E S \0 012345 ...n Desventaja. _ El carácter centinela ocupará un espacio dentro del String. _ No se conoce la longitud del String por lo que se debería programar un método que permita realizar dicha operación. Los lenguajes de programación que utilizan este tipo de almacenamiento son: C Y C++. 2. Almacenamiento de la longitud del String Los elementos del String se almacenan en un arreglo de longitud predefinida. La Longitud actual del String se almacenan en la posición 0 y no forma parte del String. max ASCII6 M A R T E S .. .. Estructura: Lineal entre los elementos del arreglo. Desperdicio del 80% en la memoria debido al almacenamiento en tantas direcciones de nodos. que tiene un rango r. que es utilizada para modelar lista de elementos iguales. Genera Strings de longitud infinita y se disminuye el desperdicio de memoria. Elementos: Números enteros. . del String (N>1) y la dirección donde se encuentra el siguiente nodo. ¿Qué es un arreglo Unidimensional? Es un tipo de datos estructurados. La implementación de sus operaciones es más compleja. Puede generar Strings de longitud infinita. Dominio: Los datos o elementos posibles a guardar estarán en el rango de 0-20 números.OBTE_ER_ELEME_TO. donde el tipo de acceso es DIRECTO debido al uso de un índice que indica la posición relativa del elemento dentro de la Estructura de Datos y además porque para acceder a cada elemento se lo hace directamente sin tener que consultar elementos anteriores o posteriores.0123456N Desventaja. Lista encadenada de nodos con N caracteres Genera una lista encadenada donde cada uno de los nodos almacena N caracteres. Datos Entrada: índice i 100 A[0] 101 A[1] 102 A[2] 103 A[3] 104 A[4] . Debido a que la longitud ocupa una posición de un carácter la longitud se restringe a 265. 100 A[0] 101 A[1] 102 A[2] 103 A[3] 104 A[4] TDA: ARREGLO. Ventajas. ya que la información contenida en el String está almacenada en forma de substrings. Representación en memoria. Además de conoce como una estructura natural. Operaciones: . El lenguaje de programación que utiliza este tipo de almacenamiento es el Pascal 1. Desventaja. está formado por una colección finita y ordenada de datos del mismo tipo. 2. Lista encadenada de nodos con un caracter Genera una lista encadenada donde cada nodo almacena un solo carácter y la dirección del siguiente nodo de la lista. Ventaja. Utilidad: Regresa el elemento del arreglo A. Desventajas. comenta con tus compañeros y con tu profesora . . Tipos de datos (int. Se hace uso del operador [ ]. Postcondiciones: se produce una condición de error si el índice i<0 o si i > N-1. . . <tipo dato/clase> [ ] identificador. donde n es la cantidad actual de elementos.AGREGAR _ ELEME_TO.. Declaración de un arreglo. Pueden contener. índice i sea < rango. boolean. Utilidad: Sustituir el elemento e del arreglo A de rango r en el índice i. Pos condiciones: Se produce una condición de error si el índice i<0 o si i > N-1. <tipo_dato/clase> identificador [ ]. donde n es la cantidad actual de elementos. el elemento nuevo e } Datos Salida: El arreglo A con un elemento mas Precondiciones: índice i<N Postcondiciones: Se produce una condición de error si el índice i<0 o si i > N-1. . boolean [ ] productos disponibles. Datos Entrada: índice i. Datos Entrada: elemento e. donde n es la cantidad actual de elementos..ELIMI_AR_ELEME_TO. Los arreglos son considerados como objetos cuyo tamaño se determina en tiempo de compilación y no puede ser modificado en tiempo de compilación. int [ ] edades_Estudiantes. el índice i Datos Salida: el elemento anterior Precondiciones: índice i<rango.. Curso de Estructuras de Datos Orientada a Objetos 7 Ejemplos: String [ ] días_Semana.!!! Curso de Estructuras de Datos Orientada a Objetos 6 Datos Salida: elemento e Precondiciones: elemento e. o los definidos por el usuario). double [ ] notas.. Manejo de arreglos. ¿Cómo podríamos resolver este problema?. . este guardado dentro del arreglo A. en el arreglo A del rango r. Piensa en varias soluciones. char. (ESCRIBIR) Utilidad: Colocar un elemento e. Analiza: Se tienen las notas de un grupo de 90 estudiantes y necesitamos saber cuántos de estos estudiantes tienen tienen una nota superior al promedio del grupo.. Dispone de una función miembro para consultar la longitud de arreglo length. float) Objetos de clases (los del API. char [ ] vocales. for(int i<0. Para calcular el número de elementos que están en la Matriz se realiza la siguiente operación: ne=n elementos1* n elementos2* n elementos n.i++){ System. Int [ ] edades_Estudiantes={15. Edades [1]=28.2. int [ ] edades.23. Ejemplo. Arreglos bidimensionales más conocidos como matrices (mxn). 1. Se lo hace a través de un recorrido. edades [0]=15.length. Principales Operaciones 1. ne=m*n ne=3*2 ne=6. 1. Reservar el espacio en memoria y se requiere de un constructor que es el operador (new). 2. Collection.println(edades [i]).Creación de los arreglos. donde m representa a las filas y n a las columnas. Presentación de los arreglos. Ver información. Arreglos Bidimensionales (Matrices) ¿Qué es un arreglo bidimensional? Un arreglo bidimensional es un conjunto de datos homogéneos finito y ordenado donde se hace referencia a cada elemento por medio de dos índices: renglón (fila) y columna. Crear con valores iníciales. Sintaxis: Nombre_Arreglo[subíndice]= valor . edades Sintaxis: Nombre_Arreglo[subindice]. Representación de una matriz MATRIZ COLUM/AS FILAS .18. 2. Actualizar un arreglo. String [ ] días_Semana=new String [7]. Edades[3]. Ejemplos: Crear un arreglo vacio.25}. } Java utiliza los siguientes api: Vector.20. 3.out. Errores. Array que son clases y/o interfaces que permiten almacenar cualquier clase de objetos como elementos y que pueden ser usados independientemente como unidimensionales o multidimensionales. su manipulación es similar a los arreglos unidimensionales sin acceso directo la única variación es que se requiere tantos índices como dimensiones se tengan. Saber el contenido o el valor del arreglo de una determinada posición.18}.2. También conocidos como arreglos de arreglos.i<edades. int [4] edades={15. Asignar valor a un arreglo sin haber determinado su tamaño. int [4]edades. retorna el 25 ya que está en la posición 3. Crear arreglos estáticos en tiempo de compilación. Ejemplo de actualización de la posición 1.20. 2) p(M-A. 2. double [ ][ ]x.0) P(1.5. 3.b Matriz): Matriz + resta(a: Matriz.N-1) Manejos de Arreglos Bidimensionales (Matrices) Declaración: <Tipo/Clase> [ ][ ]identificador.i++){ for(int j=0.0) P(0.0}.1) P(0.0) P(2.0.2) p(2.println(x[i][j]). i<n. que es la abstracción de una matriz cuadrada considere el siguiente modelo: Curso de Estructuras de Datos Orientada a Objetos 11 */ public class Matriz { .0.j<n.1) P(2.0 1 2 . y otro ciclo anidado que recorre a las columnas(j).0}}.2. Presentación: Utilizar un ciclo repetitivo que recorre las filas(i).x[ ][ ]:doublé // array bidimensional //constructores + Matriz(n: entero) + Matriz(x [ ][ ]double) //métodos de la clase Matriz + suma(a: Matriz.0}.0.2) p(0. Mireya Erreyes Tarea 4: Implemente la clase Matriz.{10. } } Matriz + n: entero //dimensión de la matriz .b Matriz): Matriz + productoEscalar(double.out. 2.N-1) M P(M. Modificación: Actualizar al elemento: x [2][0]=4.0) P(M.b Matriz): Matriz + multiplicacion(a: Matriz. for(int i=0.0.j++){ System. Creación: 1.N-1) 2 P(2.. / 0 P(0. Un arreglo bidimensional vacio: double [ ][ ]x=new double[3][2].2) p(1.a: Matriz): Matriz + transpuesta(a: Matriz): Matriz + sumaDiagonal(): double +sumElemSobDiagonal():doublé package finalmat.1) P(1.1) P(M.{6. Con valores iniciales double [ ][ ]x={{1. Operaciones Básicas Lectura: Obtener un elemento contenido en la matriz: double r = x [1][1]=5.8. /** * @author Ing.N-1) 1 P(1. } //Para mostrar los datos redefinimos la función toString //de la Clase base Object de la cual deriva implicitamente Matriz public String toString(){ String texto="\n". y {}B existan.Conjuntos TDA CO/JU/TOS Elementos: Puede ser cualquier tipo de objetos (elementos diferentes). Datos de Entrada: Dos conjuntos { }A. } } } public Matriz(double[][] x) { this. for(int i=0. i<n. { }B. //Array bidimensional //Constructores public Matriz(int n) { this. j<n. } Curso de Estructuras de Datos Orientada a Objetos 12 // texto+="\n". x=new double[n][n].round(1000*x[i][j])/1000. OPERACIO/ES: . return texto. } texto+="\n"./** Miembros dato */ public int n. j<n. i++){ for(int j=0.I_TERSECCIO_: AI B = {xÎ A y xÎ B} Utilidad: Se reemplazará en {}A con la intersección del conjunto A y B.n=n. Datos de Salida: El conjunto {}A modificado o también puede ser un nuevo conjunto {}C.x=x.3. esto es ejecutar A¬ AI B. Precondiciones: Que el conjunto {}A. i++){ for(int j=0.0. } 1. Dominio: Son todos los datos posibles a guardar dentro del rango definido por el usuario en relación con el tipo de aplicación de la estructura. //dimensión private double[][] x.length.U_ION : AU B = {xÎ A o xÎ B} Utilidad: Que se reemplaza en A con la unión A y B. . for(int i=0. j++){ x[i][j]=0. Estructura: Tiene una estructura lineal entre los objetos del conjunto. esto es ejecutar A¬ AÈ B Datos de Entrada: Dos conjuntos { }A. j++){ //texto+="\t "+(double)Math. { }B. i<n. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la unión . texto+="\t "+x[i][j]. n=x. add(3).Set Unión addAll (collection c) Intersección retainAll(collection c) Diferencia removeAll(collection c) Ejemplo de representación de la operaciones(Unión. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la intersecsión.add(7). Set b = new TreeSet(). Precondiciones: Que el conjunto {}A. b. a. y {}B existan.size()). System. //interseccion .out.addAll(b). y {}B. b. Intersección y Diferencia de la Estructura Conjunto en Java import java.out.// elemento repetido no se añade al conjunto b. b. public class Miconjunto { public Miconjunto() { } public static void main(String[] args) { //Declaracion de los conjuntos Set a = new TreeSet(). // union System. a. System. b.retainAll(b). System.DIFERE_CIA: A B ={xÎ A o xÏB} Utilidad: Reemplaza en A con la diferencia A y B.add(1). Datos de Entrada: Dos conjuntos { }A. Datos de Salida: El conjunto {}A modificado o también puede ser un nuevo conjunto {}C.println("A Union B: "+ a).out.println("Numero de elementos del conjunto B es: "+ b.util. System.add(4). Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la diferencia del conjunto {}A.add(10). Se puede realizar éstas operaciones sobre el primer conjunto o sea el conjunto A ó se definir a éstas operaciones sin alterar al conjunto A.println("Elementos del conjunto B son: "+ b).*. a. El paquete Java. que tiene como características las siguientes: Un conjunto no puede contener elementos duplicados Incluye métodos parecidos a los definidos en el TDA mencionado anteriormente Correspondencia entre TDA CO_JU_TO y la Interfaz Java. Precondiciones: Que el conjunto {}A.add(3). //Operaciones con los conjuntos a.println("Elementos del conjunto A son: "+ a). incluye la interfaz SET.add(12).Datos de Salida: El conjunto {}A modificado o también puede ser un nuevo conjunto {}C. devolviendo en un nuevo conjunto que podría ser el conjunto C.Set TDA CO/JUnTO Interfaz Java.add(5). { }B.util. a.out.size()). . y {}B existan. //Añadir elementos a los conjuntos a.add(5).println("Numero de elementos del conjunto A es: "+ a. esto es ejecutar A¬ A B.util.util.out. println(ss). } } SALIDA POR PANTALLA Número de elementos del conjunto A es: 3 Elementos del conjunto A son: [1.println("Conjunto Original :"+ss).out. System. // Insercion en la vista de un elemento fuera de rango . // diferencia System. i++) ss.println("Se añade un nuevo elemento a la coleccion original").println("Se borra el 9 a la vista borra a la coleccion original").remove(new Integer(6)).*/ for(int i=0. System. System. System. public class Main { public Main() { } public static void main(String[] args) { // Crear el conjunto SortedSet ss = new TreeSet(). System. System.*. 5] Número de elementos del conjunto B es: 5 Elementos del conjunto B son: [4.println("Luego de elminar el 6: "+ss).out.println("Vista del ss: " + vista). //Si se borra de la vista tambien afect al original System. 5. //Crear un vista SortedSet vista = ss. a.add(2).out.out.remove(new Integer(9)).out. 12] A Intersección B : [4. 7. 10. 5.println("A Interseccion B : "+ a). vista. i--) ss.println("Conjunto original: "+ss).out.tailSet(new Integer(5)). 10. 3. System.println("Vista: "+vista).out.add(4). //Eliminar el 6 ss.out. 12] A Union B: [1.System. 5. //SortedSet vista = ss. System.removeAll(b). a.util. 4.tailSet(5). i<=9 . 7. /* for(int i=9.out. System.out.out.out.add(new Integer(6)).add(new Integer(i)). 3. 7. 10. 12] A diferencia B : [2] BUILD SUCCESSFUL (total time: 1 second) Curso de Estructuras de Datos Orientada a Objetos 16 Ejemplo de representación de las operaciones con Subconjuntos en Java import java. i>=0 . //Se añade a la coleccion principal el numero 6 ss.println("Vista :"+vista).println("Conjunto original: "+ss).add(new Integer(i)).println("A diferencia B : "+ a). a. println("Vista de vista"+vistaDeVista). 9] Se borra el 9 a la vista borra a la coleccion original Vista :[5. 5. 2. 6. 4. 1. 8. 5] BUILD SUCCESSFUL (total time: 0 seconds) 1. 4.out. new Integer(7)). } vista = ss. } } SALIDA POR PANTALLA Conjunto original: [0. 7.out.//Provoca una excepcion try { vista. 2. 2. //Si no es así obtenemos una excepción try { vistaDeVista = vista. 3. el tamaño de esta colección no es fija y está limitada solo por la cantidad de memoria secundaria (disco o cinta) disponible. Un archivo de datos es una estructura constituida simplemente por colecciones de datos que se pueden guardar. Otra característica importante de los archivos es que permite almacenar gran cantidad de información.println("Set"+ss). 8. 8. 3. 4.out. 5. // sin añadir el elemento //Se puede crear una vista de otra pero siempre que los argumentos //de la segunda se encuentren en el rango de la primera. } catch(IllegalArgumentException e) { System. System. 1. } System. 4. 3. Es decir. 5. 1.subSet(0. 7. 3. 4. 6. Curso de Estructuras de Datos Orientada a Objetos 17 } catch(IllegalArgumentException e) { System. Archivos o ficheros La estructura de datos tipo archivo (ficheros) es la única estructura de datos que se almacena en memoria secundaria o externa (disco o cinta). 8] Sub set[0.headSet(new Integer(7)). 6. 9] Se añade un nuevo elemento a la coleccion original Vista: [5.println(" Sub set"+vista). 7. 8. 2.4. 6. 9] Vista del ss: [5. 4. 8] Vista de vista[5.println("El rango de la nueva vista no está contenido en la vista original").out. 7.out. 3. 1. 9] Conjunto Original :[0. 7.println("Vista sin añadir el 4 : "+vista). 7.6). 6. Esta colección de datos sirve para la entrada y salida a la computadora y se maneja con un programa en contraste con archivos y registros. 5.println("Se quiere añadir un elemento fuera del rango"). 2. 7. 6. System. 8. System. 8] Se quiere añadir un elemento fuera del rango Vista sin añadir el 4 : [5. para uso posterior mediante la ejecución de programas adecuados. 1. 6] El rango de la nueva vista no está contenido en la vista original Set[0.out. 1. 2. 5. 6. 9] Luego de elminar el 6: [0. SortedSet vistaDeVista = vista. 3.add(new Integer(4)). 7. 8] Conjunto original: [0.subSet(new Integer(4). 7. los . El período de conservación es breve.archivos son dinámicos.Son los archivos auxiliares creados durante la ejecución del programa y borrados habitualmente al terminar el mismo. _ Archivos de movimiento o transacciones. Cada archivo se puede manipular por un identificador. Un archivo está compuesto por un conjunto de registros que es una colección de los elementos de información sobre una entidad particular. en otras veces se podría acceder rápidamente a un dato sin recuperar los datos anteriores. Métodos de acceso a un archivo Curso de Estructuras de Datos Orientada a Objetos 18 Un método de acceso. a c b puntero elementos Acceso directo Índice (posición) Acceso a un archivo secuencial . y estos pueden a su vez contener subcampos los que están compuestos de caracteres. De situación: son los que en cada momento contienen información actualizada. Existen dos métodos para acceder a un archivo de datos: acceso secuencial y acceso aleatorio. los diferentes elementos se conocen como campo que pueden guardar información diferente. Los archivos no están limitados por la memoria donde están contenidas las estructuras. Acceso Aleatorio o Directo Permite procesar o acceder a determinado elemento mediante una dirección en el soporte de almacenamiento..Son aquellos que se utilizan conjuntamente con los maestros (constantes). ya que suelen destruirse una vez efectuados los cambios sobre el maestro. Históricos: contienen información acumulada a lo largo del tiempo de archivos que han sufrido procesos de actualización. para el procesamiento de las modificaciones experimentadas por los mismos. Representación Grafica Clases de archivos Los archivos se clasifican de acuerdo a las funciones que realizan: _ Archivos permanentes.Son aquellos cuyos registros sufren poca o ninguna variación a lo largo del tiempo. Pertenecen también a este tipo los utilizados para comprobación de los resultados intermedios en un determinado proceso. a veces se pude procesar dato por dato. Acceso Secuencial Exige el tratamiento elemento a elemento es necesario una exploración secuencial comenzando desde el primer elemento hasta llegar al elemento buscado. y contienen algún campo común en sus registros con aquellos. no es más que la forma como recuperar la información del archivo. Se dividen en: Constantes: están formados por registros que contienen campos fijos y campos de baja frecuencia de variación en el tiempo.. esto es que se pueden hacer archivos de datos más grandes o más pequeños según sean las necesidades.. o bien acumulan datos de variación periódica en el tiempo. _ Archivos de maniobra o transitorios. al obtener dinero de un cajero automático. Ejemplo de manejo de un archivo tipo texto. SECUENCIAL: Entre sus principales características tenemos más sencillos de implementar... _ Archivos de programa. import java. Acceso directo: Se puede acceder secuencial o aleatoriamente y está compuesto por bytes. public static void main( String args[] ) throws IOException { . Representación de la Estructura Archivo 1.Contienen instrucciones para procesar datos que se almacena en otros archivos o residen en memoria.Contienen datos alfanuméricos y gráficos introducidos por un editor de texto.Acceso a un archivo directo Curso de Estructuras de Datos Orientada a Objetos 19 _ Archivos de informes. 2. Con tipo o Serializables: Se puede acceder secuencialmente. y solo trabaja con objetos. se compone de un archivo de datos(secuencial) y un archivo de índices(guarda las llaves o clave del archivo secuencial.. o sea la dirección del dato correspondiente en disco).*. deben actualizarse en forma periódica para reflejar los cambios dados en la información almacenada. _ Archivos de texto. INDEXADOS: Entre sus principales características tenemos: que este tipo de archivos requiere que se conozca la dirección donde se encuentra el dato a buscar.Contiene datos que están organizados para presentaciones a los usuarios. Ejemplo: archivo que almacena los datos de los clientes de un banco. no es eficiente cuando la cantidad de datos a almacenar es grande.io. Tipos de archivos Texto: Solo permiten acceso secuencial y su unidad constitutiva es el carácter. //siempre es la misma.txt"). por ejemplo una agenda telefónica. System.x++) Exposición Nro.txt").out.length()+" bytes" ). for (int x=0. la clase File. System.*. // Vamos a volcar 10 líneas iguales ayudándonos de un bucle for.x<10. bw. Nota: Se tomará en cuenta el material de apoyo utilizado para la exposición y debe entregar una copia digital a cada grupo. Buffer. que a su vez envuelve al fichero (o stream). //File f = new File ("c:\\mire".write() del buffer.canWrite() ? " y se puede Escribir" :") ).io.canRead() ? " se puede Leer" : "") ). Curso de Estructuras de Datos Orientada a Objetos 21 bw. BufferedWriter bw = new BufferedWriter(new FileWriter(f)). 3: Investiga en el Api de Java para Archivos.print( "Fichero existente " ). if( f. //*************LEER EL ARCHIVO******************************** //Manejar el buffer Reader es muy sencillo ya que simplemente deberemos de //ejecutar lecturas por línea.getPath() ). para cada una debe indicar detalladamente.println( (f.out. sintaxis y un ejemplo de su utilización."datos. que envuelve a Reader.println( "El fichero no existe. //***************METODOS DE FICHEROS ************************ System. que envuelve a Reader. .println( "La longitud del fichero son "+ f. BufferedWriter.//****************CREAR EL FICHERO************************** File f = new File ("c:\\mire\\datos.txt").out. //Para escribir utilizamos en el método . sus constructores y para la explicación de las principales operaciones exponer la utilidad. System.close(). System.} else System.out. public static void main( String args[] ) throws IOException { //****************CREAR EL FICHERO************************** File f = new File ("c:\\mire\\datos.write("Fila Nro. //Para escribir utilizamos en el método .out. BufferedReader. BufferedWriter bw = new BufferedWriter(new FileWriter(f)). // Vamos a volcar 10 líneas iguales ayudándonos de un bucle for.io.x++) import java.out. //*************ESCRIBIR EN EL FICHERO************************* //Recuerda que la filosofía de acceso a la lectura y escritura a los ficheros.getName() ).exists() ){ System. Además debe realizar un programa demostrativo de manipulación de Archivos en Java. RandomAccessFile." + x + " HOLA "+ "\n"). for (int x=0.txt"). que a su vez envuelve al fichero (o stream)." ).x<10. //siempre es la misma. //File f = new File ("c:\\mire". que pertenece al paquete Java."datos. //*************ESCRIBIR EN EL FICHERO************************* //Recuerda que la filosofía de acceso a la lectura y escritura a los ficheros.print( (f.println( "Nombre: "+f.out.println( "Camino: "+f.write() del buffer. además una copia impresa y digital a la profesora el día de la exposición. Buffer. } SALIDA POR PANTALLA Nombre: datos. String s = "Informacion\n".println("El tamaño del fichero es: "+Rf.2 HOLA Fila Nro.readLine().length())..seek( Rf.seek(12).4 HOLA Fila Nro.3 HOLA Fila Nro.readLine(). String texline=br.0 HOLA Fila Nro.length()).equals("FIN")){ System.log". System.*.6 HOLA Fila Nro.println("El tamaño del fichero es: "+Rf."). Rf.readLine().io.close().writeBytes( s ).seek(0).writeBytes("Hola"). Rf.8 HOLA Fila Nro.. //NOS UBICAMOS EN LA POSICION 12 Y AÑADIMOS LA CADENA HOLA Rf.writeBytes("Mas datos.1 HOLA Fila Nro. Rf.7 HOLA Fila Nro. System.println("El tamaño del fichero es: "+Rf.out. String linea=Rf. System. while(!linea.out."rw" ). Curso de Estructuras de Datos Orientada a Objetos 22 // ABRIMOS EL FICHERO DE ACCESO ALEATORIO Rf = new RandomAccessFile( "c:\\mire\\fialeatorio.9 HOLA Ejemplo de manejo de un archivo tipo de acceso Aleatorio import java.out.txt Fichero existente se puede Leer y se puede Escribir La longitud del fichero son 170 bytes Fila Nro.FileReader fr= new FileReader(f). linea = Rf.println(linea).out.equals("FIN")){ System. // NOS VAMOS AL FINAL DEL FICHERO.5 HOLA Fila Nro. texline = br.length() ).length()). } br.out. // PRESENTAMOS LOS DATOS DEL ARCHIVO Rf.txt Camino: c:\mire\datos. while(!texline. } . public static void main( String args[] ) throws IOException { //DECLARAMOS EL ARCHIVO RandomAccessFile Rf.println(texline). INCORPORAMOS LA CADENA AL FICHERO Rf.readLine(). BufferedReader br = new BufferedReader(fr). String d){ nombre = n. } .// CERRAMOS EL FICHERO Rf. telefono = t. Ejemplo de manejo de un archivos Serializables MODELADO Clase Datos Datos #nombre:String #telefono: String #direccion:String +Datos(String n.. } SALIDA POR PANTALLA El tamaño del fichero es: 12 El tamaño del fichero es: 24 El tamaño del fichero es: 24 Informacion Holadatos.Serializable { protected String nombre. protected String direccion. String d). /** Creates a new instance of Datos */ public Datos(String n.. direccion = d. String t. String t. protected String telefono.close(). +getNombre():String +getTelefono():String +getDireccion():String Curso de Estructuras de Datos Orientada a Objetos 23 Clase de Lectura ContadoInput -f:FileInputStream -fi:ObjectInputStream +abrir():void +cerrar():void +leer():Datos Clase de Escritura ContactoOutput -f:FileOutputStream -sf:ObjectOutputStream +abrir():void +cerrar():void +escribir(Datos d):void IMPLEME/TACIÓ/ public class Datos implements java.io. } public String getNombre() { return( nombre ). txt"). ow.readObject()).println("Error"). } public String toString(){ String texto="\n". return texto.*.out.writeObject(new Datos("Luis".writeObject(new Datos("Maria". ow.io.println( nombre+"\n "+telefono+"\n "+ direccion ). public void abrir() throws IOException{ f= new FileOutputStream("c:\\mire\\alumno. sf = new ObjectOutputStream(f). public static void main( String argv[] )throws IOException { FileOutputStream fo = new FileOutputStream("c:\\mire\\direcciones.close().print(ol. } Curso de Estructuras de Datos Orientada a Objetos 24 } //================= GUARDAR OBJETOS EN EL ARCHIVO=========== import java.ser"). } . //Abrir el fichero. ObjectInputStream ol = new ObjectInputStream(fi).clase Datos---============= CLASE ESCRITURA========================== import java. --.*. ObjectOutputStream ow = new ObjectOutputStream(fo).io. texto ="\t " +nombre+"\t "+telefono+"\t "+direccion + "\n"."Las Pitas")). try{ while(!ol.writeObject(new Datos("Andres".txt")."La Argelia")). private ObjectOutputStream sf.out."Las Peñas")). FileInputStream fi = new FileInputStream("c:\\mire\\direcciones.public String getTelefono() { return( telefono ). } SERIALIZACION DE OBJETOS."2577903".out. }catch (Exception e){ System. ow.} ol."2546788".equals(null)) System.close(). } public void print() { System. } public String getDireccion() { return( direccion ). ow."2574643". public class ContactoOutput { /** Creates a new instance of ContactoOutput */ public ContactoOutput() { } private FileOutputStream f. ClassNotFoundException{ Datos da = null. }catch (EOFException eof){ System.out. fw. } } return da.io.readObject(). . } public void cerrar() throws IOException{ if (fi != null) fi.io. public class ContactoInput { /** Creates a new instance of ContactoInput */ public ContactoInput() { Curso de Estructuras de Datos Orientada a Objetos 25 } private FileInputStream f. } } ================= EJECUTOR============================ import java.escribir(new Datos("Maria". public void abrir() throws IOException { f = new FileInputStream("c:\\mire\\alumno. fw.*. fw = new ContactoOutput().print("Fin de archivo"). } public Datos leer() throws IOException. fi = new ObjectInputStream(f).ser").close().//Cerrar el fichero public void cerrar() throws IOException{ if (sf != null) sf. "2567898".abrir().*. } //Escribir en el fichero public void escribir(Datos d) throws IOException { if (sf != null) sf. } } ============= CLASE LECTURA========================== import java. public class FicheroSer { public static void main(String[] args) throws IOException."Las Pitas")). if (fi!= null){ try{ da = (Datos) fi. private ObjectInputStream fi. ClassNotFoundException{ //Escritura en el archivo ContactoOutput fw.close().writeObject(d). //Lectura de datos Datos da. fr. fr= new ContactoInput(). efectuando el Intercambio de posiciones cuando el orden resultante no sea correcto.abrir(). La ordenación también es conocida como clasificación."2546787". } } ============ SALIDA POR PANTALLA============== Maria 2567898 Las Pitas Curso de Estructuras de Datos Orientada a Objetos 26 Jose 2546787 La Argelia Fin de archivonull BUILD SUCCESSFUL (total time: 3 seconds 1. que resultan más lentos pero contienen mayor cantidad de información. _ Externa: Se utiliza para la ordenación de datos de un archivo. comparando el elemento inferior o superior (dependiendo de la forma del recorrido) de la lista con todos los restantes.cerrar(). Categorías _ Interna: Se utiliza para la ordenación de vectores o arreglos. MÉTODOS DE ORDE_ACIÓ_ Los métodos de ordenación. fr. 1. búsqueda e intercambio.escribir(new Datos("Jose". do { da= fr. la elección del mejor método depende del tamaño del vector o archivo. Difencias entre Ordenación interna y externa Interna Externa Los datos se almacenan en memoria interna. cintas. Existe gran cantidad de algoritmos diseñados para clasificar listas de elementos. fw.Método de Intercambio El método de intercambio es el más sencillo de todos. tablas etc.out.1. System.fw. }while (da!=null). no es más que la operación de organizar un conjunto da datos en un orden dado.println(da).leer(). . que es de gran velocidad y acceso aleatorio Los datos se almacenan en soportes de almacenamiento externo: discos. el tipo de datos a ordenar y la cantidad de memoria física disponible.cerrar(). que puede ser creciente o decreciente cuando se trata de datos numéricos y en orden alfabético directo o inverso cuando se trata de caracteres. son operaciones básicas en las que las computadoras emplean la mitad de su tiempo."La Argelia")). Su mayor utilización se dá en las estructuras arreglos y archivos. ContactoInput fr. Se basa en: la lectura sucesiva de la lista a ordenar. 35. 9. 10. 35. Análisis del método: Número de Pasadas = n 1. 10. 8. 26 {4. 35} <-. 4. 6. 8} => Se intercambia 6 por 8.Se cambia el 9 por el 40. 8.Método de selección. {4. 2} {2. 35. 40} Ya están ordenados. los más grandes. Se terminan las pasadas y el arreglo o lista queda ordenado. a[1] y a[2] a[i] y a[i+1] a[n 2] y a[n 1].10. 8. 6. {4. 4. 10. 4. 10. 40} <-.Se cambia el 21 por el 40.Ejemplo: a = { 8. 9. 9. 1. 6.Se cambia el 40 por el 10. es decir comenzamos en el siguiente elemento a[1]. Si a[i+1] < a[i] Entonces los INTERCAMBIA Ejemplo: {40. 4} => Se intercambia 2 por 4.Método de la burbuja Es un método mejorado con respecto al intercambio. {4.Se cambia el 9 por el 21. {21. a[0] y a[1]. en donde los elementos burbujean. 21. 10. 8. 1.3.Se cambia el 40 por el 4. 40. Número Máximo de Comparaciones = n(n-1)/2 Curso de Estructuras de Datos Orientada a Objetos 3 Tiempo de Ejecución = 0 (n2). 6. 4. así primero se cambia a[0] con a[1] pues a[0] > a[1] y debe ser Ascendente. 21. {4. 4. 8. cuarta y quinta pasada. 6} => Se intercambia 4 por 6. 10. 40} <-. Estudia parejas de elementos Adyacentes.9. 9. Al cabo de la pasada. 21. 4} => Se intercambia 6 por 8. 4. donde n es el número de elementos en el arreglo o lista. Análisis del método: Número de Pasadas = n 1.4. Curso de Estructuras de Datos Orientada a Objetos 2 {2. {21. Pasada 3: Ahora nos toca comparar con el elemento a[2]. 21.2. Número Máximo de Comparaciones = (n-1) (n-2) Tiempo de Ejecución = 0 (n2). Este método consiste en buscar el elemento más pequeño del array y ponerlo en la primera . Pasada 2: {4. 10. {2. 35} <-. 10.Se cambia el 21 por el 10. 6. 9. 40. {21. 9. es decir.Se cambia el 21 por el 4. 9. {2. 35} <-.Se cambia el 35 por el 40. el segundo más chico esta en a[1] y así sucesivamente. 40} <-. 35.35}: Pasada 1: {21. pero habría que hacer una tercera. 6. 40. 35. caen al fondo del array (posición n-1) y los más mas chicos suben a la cima (posición 0). 40.21. 4. dónde n es el número de elementos en el arreglo o lista. 9. Pasada 2: El elemento más pequeño esta en a[0] y se analiza la sublista restante. 35} <-. 10. 9. es decir a[0]<a[1] y por utimo a[0] con a[3]. 40} <-. {21. 4. 2 } Pasada 1: Se compara a[0] con todos. 2} => Se intercambia 4 por 8. 21. Análisis del método: Número de Pasadas = n 1. 40. 9. Insertamos el 10: { 4. 4. 21. 21. 40. 21. 10.21.40}. 9. 9. Por lo tanto. 10. 9. Y por último insertamos el 35: . {21. 21. 9.40}. 10. 35} {40.Se coloca el 21. 35} <== aux=9. 35} <== aux=10. en primera posición: se cambia el 4 por el 40.Método de inserción directa Este método lo que se hace es tener una sublista ordenada de elementos del array e ir insertando el resto en el lugar adecuado para que la sublista no pierda el orden. 40. {4. 40. {4. {4. Ejemplo: {40. 40} <-. 10.9. 10. 40. 35} Pasada 1: {4. 10. 35} <-. 9. La sublista ordenada se va haciendo cada vez mayor. 35} <-. 21. Insertamos el 21: Curso de Estructuras de Datos Orientada a Objetos 4 {40. se busca el elemento más pequeño y se coloca en segundo lugar. 9. {4. 40. entre los restantes. 4. 10. 40. 35} <== aux=4.10.21. 40. 10. dentro de una lista que ya está Ordenada Ejemplo: se tiene {40. 10. en segunda posición: se cambia el 9 por el 21. en tercera posición: se cambia el 35 por el 40. 21. 9. dónde n es el número de elementos en el arreglo o lista. 21. 9. 21. 4.Se coloca el 4. u otra forma de entender es que. 9. de modo que al final la lista entera queda ordenada. 35} <== Ahora la sublista ordenada es {4. 21. Número Máximo de Comparaciones = n(n-1)/2 Tiempo de Ejecución = 0 (n2). 35} <-. Insertamos el 4: {21.21.40}. 10. 21. debe realizar sucesivas pasadas hasta que no haya posiciones restantes. 9. Pasada 2: {4. 4. 35. 35} <== aux=9. 21.9. 21. y así sucesivamente hasta colocar el último elemento.Se coloca el 35. 40. 40. luego. 21. 10.Se coloca el 10. 21. 35} <== aux=10. 10. 35} <-. Pasada 4: {4. 40. 9. 10. 35} <== La primera sublista ordenada es {40}. {4. 40. 35} <== aux=4. en tercera posición: ya está colocado. 40. 21. 9. 4. Insertamos el 9: {4. Pasada 3: {4.4. 1.Se coloca el 9. 9. 40. Pasada 5: {4. 40. 21. el más pequeño. 21.posición. 10. 35} <== Ahora la sublista ordenada es {4. en tercera posición: se cambia el 10 por el 40. 35} <== Ahora la sublista ordenada es {21.40}. 35} <== Ahora la sublista ordenada es {4. 40. 10. 9. consiste en insertar un elemento en su posición correcta. 9. 40. {21. 40. 10. 35} <== aux=21. 9. 10. 40} <== se intercambian el 4 y el 9. 35. 40} <== aux=35. Este salto es constante. Análisis del método: Dónde n es el número de elementos en el arreglo o lista. 10. Tiempo de Ejecución = 0 (n). es un Método Avanzado que se le suele llamar Ordenación Por Inserción con Intervalos Decrecientes. 40. dónde salto/2 . 10. Entonces el salto se reduce a la mitad. Análisis del método: Tiempo de Ejecución = O(n*(Log2 n)). 40. 21. 10. cuando por inserción se necesitaban muchos más. 40. 4. 4. 21. 21. 4. 40. Se van dando pasadas hasta que en una pasada no se intercambie ningún Curso de Estructuras de Datos Orientada a Objetos 5 elemento de sitio. 4. 9. 10. 21. 35} <== se intercambian el 21 y el 10. 21. 40} <== El array está ordenado. 35} {9. 40. Vemos que cuanto más ordenada esté inicialmente más se acerca a O(n) y cuanto más desordenada.5. sino con el que está a un cierto número de lugares (llamado salto) a su izquierda. 9. 9.{ 4. 10. 21. 10. lo cual es una mejora al método de Inserción directa cuando el arreglo o lista tiene una gran cantidad de elementos. {9. 40. 35} <== se intercambian el 10 y el 4. 21. dónde n/2. { 9. 4. {4. 10. 4. 40. 10. Primera pasada: {9. 35} {9. 10. 4. más se acerca a O(n2). con lo que para ciertas entradas podemos tener ahorros en tiempo de ejecución. algo que no ocurría en éstos. 35} <== se intercambian el 40 y el 9. Dónde n es el número de elementos en el arreglo o lista. 4. 10. y así sucesivamente hasta que el salto vale 1. 21. 35. Primera pasada: {9. Peor de los casos: Número Máximo de Comparaciones = n*(n+1)/2-1. 9.Método de ordenación rápida (quicksort) . En este método no se compara a cada elemento con el de su izquierda. 10. 40. 21. Segunda pasada: {4. 1. {9. 21. El peor caso es igual que en los métodos de burbuja y selección. 4. y se vuelven a dar pasadas hasta que no se intercambie ningún elemento.Shell. pero el mejor caso es lineal. Tiempo de Ejecución = 0 (n2). como en el de inserción. 40} <== se intercambian el 35 y el 40. 35} n=6 Salto = 3. Mejor de los casos (cuando la lista o arreglo ya esta ordenada): Número Máximo de Comparaciones = n 2. {9. y siendo división entera). 35} <== se intercambian el 40 y el 21. 21. El caso medio dependerá de cómo están inicialmente distribuidos los elementos. 35} Salto = 1. 1. Ejemplo: se tiene {40. Con sólo 6 intercambios se ha ordenado el array.6. 10.L.Método shell Debe su nombre a su inventor D. (Todas ellas falsas). 21. y su valor inicial es N/2 (siendo N el número de elementos. 35. length). y se realizan dos búsquedas: una de izquierda a derecha. 4. 4. y se repetiría el mismo proceso. 40.Este método se basa en la táctica "divide y vencerás" que consiste en ir subdividiendo el array en arrays más pequeños. y la búsqueda de derecha a izquierda encuentra el valor 10.j++){ if(a[i]>a[j]){ aux=a[i]. for(int i=0. 10.4} y el {40. y se mueven todos los elementos menores que este pivote a su izquierda. el 9. se toma un valor del array como pivote. se coloca el pivote en su lugar (en el número encontrado por la segunda búsqueda).10. 35} <== Ahora tenemos dividido el array en dos arrays más pequeños: el {9. mayor que pivote.j<=a. 35} <== se toma como pivote el 21. // Para llamar a la función. la primera encuentra el valor 40.0. y los mayores a su derecha. y la segunda el valor 9. 40. i<=a. a[i]=a[j].10.array. La implementación es claramente recursiva y suponiendo el pivote el primer elemento del array. los pasos serían: {21. a[j]=aux. 4. 40. 35} <== Si seguimos la búsqueda.40. Para terminar la división. buscando un elemento mayor que el pivote. } } } . y otra de derecha a izquierda.35}. así que paramos. Dónde n es el número de elementos en el arreglo o lista. quedando: {9. Se intercambian: Curso de Estructuras de Datos Orientada a Objetos 6 {21.i++){ for(int j=i+1.length-1. /** * * @author Mireya Erreyes */ public class Metodos { public Metodos() { } //Ordena ascendentemente por el método de Intercambio public void intercambio(int a[]){ int aux.9. y ordenar éstos.4. menor que el pivote. 21. La búsqueda de izquierda a derecha encuentra el valor 40.length-2. Análisis del método: Tiempo de Ejecución = O(n(Log n)). A continuación se aplica el mismo método a cada una de las dos partes en las que queda dividido el array. Normalmente se toma como pivote el primer elemento de array. Cuando se han encontrado los dos. 9. se intercambian. pero ya se han cruzado. Ejemplo: Para dividir el array {21. 10. buscando un elemento menor que el pivote. Implementación de los Métodos de Ordenación Métodos package arreglos. y se sigue realizando la búsqueda hasta que las dos búsquedas se encuentran.35}. 9. el programa sería (en el método main): ordenar(array. Para hacer esta división. 10. j++){ if(a[j]<aux){ idmenor=j. aux=a[j]. break.i++){ aux=a[i].} //Ordena ascendentemente por el método de la Burbuja public void burbuja(int a[]){ int aux. idmenor=i.length.j<a. int j. }else{ a[j+1]=a[j]. a[j]=aux. } } if(j==-1) a[0]=aux. a[j+1]=a[j]. for(int i=0.length. } } a[idmenor]=a[i]. i<a.j<a.i++){ aux=a[i]. for(int i=0.length-1. for(j=i-1. a[i]=aux.j++){ if(a[j+1]<a[j]){ aux=a[j+1]. i<=a.j>=0. } } . } Curso de Estructuras de Datos Orientada a Objetos 7 } } } //Ordena ascendentemente por el método de Selección public void seleccion(int a[]){ int aux. for(int j=i+1.length-1.j--){ if(aux > a[j]){ a[j+1]=aux.i++){ for(int j=0. i<=a. } } //Ordena ascendentemente por el método de Inserción Directa public void insercionDirecta(int a[]){ int aux. idmenor. for(int i=0.length-i-1. } }while(i<=j). a[i]=a[j]. do{ while(a[i]<pivote){ i++.//Ordena ascendentemente por el método de Shell public void shellsm(int a[]){ int aux. if(izq <j){ quicks(a. c=1.i< a. } if(i<=j){ int aux=a[i]. } if(i<der){ quicks(a. int pivote = a[(izq+der)/2].izq. while (s!=1) { s=s/2. s=a. } } public void presenta(String msg. i++.i++){ if(a[i] > a[i+s]){ aux=a[i].i. for(int i=0.der). a[i]=a[i+s]. } Curso de Estructuras de Datos Orientada a Objetos 8 } } } } //Ordena ascendentemente por el método de Quick Sort public void quicks(int []a.j). c=1. a[i+s]=aux. int der){ int i=izq. while(c==1){ c=0.length-s.int a[]){ . a[j]=aux. int izq. int j=der.length.c. j--. } while(a[j]>pivote){ j--.s. 8. // ord.10.35. ord.seleccion(a).40. } } Ejecutor package arreglos. // ord.9.out.presenta("Insercion Directa".0. // ord.a). }}Corrida run: Desordenados :[40.out.8.insercionDirecta(a).10.print("[").burbuja(a). // ord.8.System.presenta("Ordenados con Selección". //Ordena por seleccion // ord.21. } } System.presenta("Ordenados con Burbuja".21.35.10. //Ordenar con el método Burbuja // ord.print("\n"). /** * * @author Mireya Erreyes */ public class EjecutaMetodos { Curso de Estructuras de Datos Orientada a Objetos 9 public static void main(String[] args) { //Declarar un arreglo int a[]={40.length-1){ System.40.10.out.out.4.out. // ord.a).9.shellsm(a).10.a).35. }else{ System. //Ordenacion con el método Shell // ord.4.print(a[i]+"]"). ord.print(a[i]+".length-1.presenta("Quicksorted".40] Quicksorted :[4.4. //Ordena por inserción directa // ord. //Ordena con Quicksort ord.print(msg+" :").i++){ if(i<a.length-1). System.67.presenta("Ordenados con Intercambio".a).21.presenta("Ordenados Método Shell".40}.a). for(int i=0.4.67] BUILD SUCCESSFUL (total time: 0 seconds) .intercambio(a).presenta("Desordenados". //Ordenar con el método de Intercambio // ord.a.a). i<=a.quicks(a.67.4. //Objeto de la clase métodos Metodos ord=new Metodos().a).10.9.").