Programación OO Anexo2: Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Vector y Enumeration La clase Vector class java.util.Vector extends AbstractList Collection, Serializable implements List, Cloneable, La clase Vector describe un Array con largo variable. Objetos de la clase Vector son representados en una lista lineal. La lista puede contener elementos de diverso Typs, su largo es variable (Array con variable Largo). Vector permite insertar elementos en cualquier lugar. JDK realizó Vector como Array de elementos de tipo Object. Crear Nuevo Vector (Constructor): public Vector() public Vector(int initialCapacity, int capacityIncrement) // Un vector se agranda en forma automática, en el caso que sean incorporados más elementos a lo planificado,(Resizing). Por eso que initialCapacity y capacityIncrement, deben ser bien escogidos. Insertar elementos: public void addElement(Object obj) // añadir al final de la lista de Elementos. Propiedades: public boolean isEmpty() // probar, si el vector esta vacío. public int size() // se asegura con el nº de elementos. public int capacity() // probar el largo del arrays. Ud. Puede asegurarse con Capacity() para cambiarla. Añadir en cualquier lugar, al interior de la lista.: public void insertElementAt(Object obj, int index) throws ArrayIndexOutOfBoundsException // añade un obj en la posición index del "Vector". Buscar un Elemento: Para la busqueda secuencial esta Iterator a disposición. Pero existen además.: public Object firstElement() throws NoSuchElementException; public Object lastElement() throws NoSuchElementException; public Object elementAt(int index) throws ArrayIndexOutOfBoundException; firstElement() entrega el primero, lastElement() el último Elemento- Con elementAt() se busca el Elemento de la posición index. ________________________________________________________________________ Area de Computación, Universidad de La Serena 1 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Vector << Constructoren >> public Vector() // Un Vector será declarado. public Vector(int startCapacity) // Un Vector contiene espacio para startCapacity Elementos public Vector(int startKapazitaet, int kapazitaetsSchrittweite) << Metodos >> public Object elementAt(int index) // el objeto que se encuentra en index será devuelto. public int size() public Object firstElement() public Object lastElement(); public void insertElementAt(Object obj, int index) public void setElementAt(Object obj, int index) public copyInto(Object miArray[]) // Copia el Elemento del Vector en el Array miArray // en el caso que no lo permita, se genera una IndexOutOfBoundsException public boolean contains(Object obj) // busca los Elementos, entrega true si viene obj en Vector. public int indexOf(Object obj) public int lastIndexOf(Object obj) public boolean removeElement(Object obj) // elimina obj de la lista. public void removeElementAt(int index) // elimina el Elemento del lugar index public void removeAllElements() // elimina todos los Elementos public int capacity() // entrega cuantos elementos posee Vektor public Object clone() public String toString() La clase Stack class java.util.Stack extends Vector Un Stack es una estructura que trabaja bajo el principio LIFO. Elementos son incorporados por delante y por allí son también eliminados. En Java, Stack es una derivación de Vector con nuevas propiedades. ________________________________________________________________________ Area de Computación, Universidad de La Serena 2 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Constructor: public Stack(); Añadir nuevo Elemento: public Object push(Object item); Buscar el elemento de más arriba: public Object pop(); // busca y elimina el elemento de más arriba. public Object peek() // busca el elemento de más arriba. Buscar en Stack: public int search(Object o) // Buscar elemento arbitrario, // entrega: Distancia entre el elemnto buscado y el elemento de más arriba. // y –1, en el caso que el elemento no exista. Test:public boolean empty() // se asegura si Stack está vacío. Vector Stack public Stack() public Object push(Object obj) public Object pop() public Object peek() public int search(Object obj) public boolean empty() Un Stack es un Vector. Esto significa que funciones, tales como, add(), addAll(), addElement(), capacity(), elementAt(), .... .siguen estando clear(), clone(), contains(), copyInto(), a disposición. Hasta el momento ya aprendió a construir una lista dinámica de datos mediante una lista enlazada. También podrá utilizar la clase Vector de Java para almacenar los datos. El objeto Vector proporciona la capacidad a la estructura array de redimensionarla dinamicamente, es decir, es un arreglo ajustable que puede aumentar o disminuir su tamaño dependiendo del número de elementos que tenga que guardar, a diferencia de C++, la que debe llamar a la función realloc para aumentar la capacidad de almacenamiento de un arreglo, mientras que un vector aumenta su tamaño en forma automática conforme lo necesita. La clase Vector proporciona métodos que permiten insertar, eliminar y buscar elementos. Vector miVector = new Vector(15); // miVector es una referencia a un objeto Vector con una capacidad inicial de 15 elementos. Vector miVector = new Vector(15, 5); // miVector es una referencia a un objeto Vector con una capacidad inicial de 15 elementos, y un incremento de tamaño de 5. ________________________________________________________________________ Area de Computación, Universidad de La Serena 3 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Un objeto Vector tiene una capacidad y tamaño. Para determinar la actual capacidad de un Vector use el método capacity(). Para encontrar el tamaño actual de Vector use el método size(). La capacity es el numero de slots disponibles. El size es el número de slots que tienen los datos en el. Slots 0 hasta size-1 tienen datos. Los elementos de un Vector son accesados usando un indice integer. Como con arrays, el indice es un valor integer que parte de 0. El siguiente fragmento crea un vector y le agrega varios elementos String con el método addElement. Vector lista = new Vector(); lista.addElemet(new String(“Java”)); lista.addElemet(new String(“C”)); lista.addElemet(new String(“C++”)); En algunas ocasiones deberá saber cuantos elementos contiene el vector. En estos casos podrá usar el método size de la clase Vector. Por ejemplo, usando el fragmento anterior, basta con incorporar la línea System.out.println(“número de elementos en la lista = “ + lista.size()); Cuyo resultado debería ser 3. El ciclo usa el método size() para asegurarse que todo elemento sea accesado. Un Vector tiene datos en los slots 0 a size()-1. Este programa nos dice el como imprimir los datos de un Vector, aunque luego se verá que Enumeration facilita la tarea. EJEMPLOS: Que imprime el programa siguiente?. Analizarlo. import java.util.* ; class VectorEg0 { public static void main ( String[] args) { Vector nombres = new Vector( 10 ); nombres.addElement( nombres.addElement( nombres.addElement( nombres.addElement( nombres.addElement( nombres.addElement( "Ana" ); "Boris” ); "Cristian" ); "Daniel" ); "Elena" ); "Federico" ); ________________________________________________________________________ Area de Computación, Universidad de La Serena 4 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. for ( int j=0; j < nombres.size(); j++ ) System.out.println( j + ": " + nombres.elementAt(j) ); } } Que imprime el programa siguiente?. Analizarlo. import java.util.* ; class VectorEg1 { public static void main ( String[] args) { Vector nom = new Vector( 10 ); nom.addElement( "Ana" ); nom.addElement( "Boris” ); nom.addElement( "Cristian" ); nom.setElementAt( "Sara", 0 ); nom.setElementAt( "Bartolome", 1 ); for ( int j=0; j < nom.size(); j++ ) System.out.println( j + ": " + nom.elementAt(j) ); } } Que imprime el programa siguiente?. Analizarlo. import java.util.* ; class VectorEg2 { public static void main ( String[] args) { Vector nom = new Vector( 10 ); ________________________________________________________________________ Area de Computación, Universidad de La Serena 5 Programación OO nom.addElement( nom.addElement( nom.addElement( nom.addElement( Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. "Ana" ); "Boris” ); "Cristian" ); "Debora" ); nom.removeElementAt(2); for ( int j=0; j < nom.size(); j++ ) System.out.println( j + ": " + nom.elementAt(j) ); } } Que imprime este programa? . Analizarlo. import java.util.* ; class VectorEg3 { public static void main ( String[] args) { Vector nom = new Vector( 10 ); nom.addElement( nom.addElement( nom.addElement( nom.addElement( "Ana" ); "Boris" ); "Cristian" ); "Debora" ); nom.insertElementAt( "Elena", 2); for ( int j=0; j < nom.size(); j++ ) System.out.println( j + ": " + nom.elementAt(j) ); } } ________________________________________________________________________ Area de Computación, Universidad de La Serena 6 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Construya un programa que imprime el primero y el último de un Vector con 4 elementos. Una posible respuesta es: import java.util.* ; class VectorEg4 { public static void main ( String[] args) { Vector nom = new Vector( 10 ); nom.addElement( nom.addElement( nom.addElement( nom.addElement( "Ana" ); "Boris" ); "Cristian" ); "Debora" ); System.out.println( nom.firstElement() ); System.out.println( nom.lastElement() ); } } También es posible determinar el índice de algún elemento, sino esta entrega –1. import java.util.* ; class VectorEg5 { public static void main ( String[] args) { Vector nom = new Vector( 10 ); nom.addElement( nom.addElement( nom.addElement( nom.addElement( nom.addElement( nom.addElement( "Ana" ); "Boris" ); "Cristian" ); "Debora" ); "Chris" ); "Jose" ); System.out.println( nom.indexOf( "Boris" ) ); //1 System.out.println( nom.indexOf( "Elena" ) );//-1 } } ________________________________________________________________________ Area de Computación, Universidad de La Serena 7 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Aunque un objeto Vector es un arreglo de elementos, no es posible acceder a un elemento de un vector con la sintaxis de corchetes como en arreglos comunes. Para obtener un elemento de un objeto Vector, puede llamar al método elementAt, cuyo formato es Object elementAt(int indice); siendo factible de obtener el primero y último, invocando al método firstElement y lastElement, respectivamente. Este es un ejemplo de una clase para almacenar datos de alumnos. Aplicación 1 import java.util.*; // clase para almacenar los datos de alumnos. class Alumno { String nombre; String telefono; int num_alumnos; Alumno(String nuevo_nombre, String nuevo_telefono, int nuevo_num) { nombre = new String(nuevo_nombre); telefono = new String(nuevo_telefono); num_alumnos = nuevo_num; } public String toString() { return("Nombre: " + nombre + "\nTelefono: " + telefono + "\nNum Alumno: " + num_alumnos); } } public class vector_alumnos { public static void main(String args[]) { Vector lista_alum = new Vector(); lista_alum.addElement(new Alumno("Juan Pérez", "555-1234",101)); lista_alum.addElement(new Alumno("María González", "555-4832",102)); lista_alum.addElement(new Alumno("Pedro Martínez", "555-2730",130)); for(int i = 0; i < lista_alum.size(); i++) { Alumno actual =(Alumno) lista_alum.elementAt(i); System.out.println("Alumno " + i + ":"); System.out.println(actual); ________________________________________________________________________ Area de Computación, Universidad de La Serena 8 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. } } } Sin embargo, la gracia mayor que tiene la clase Vector es el de poder almacenar objetos de diferentes tipos en el mismo vector. Esto se debe a que los objetos Vector utilizan una referencia a Object para apuntar a sus elementos. Por ello puede utilizar un objeto Vector para almacenar cualquier tipo de objeto. Aplicación 2 import java.util.*; public class vector_mixto { public static void main(String args[]) { Vector lista_mixta = new Vector(); // agregar 3 enteros al vector lista_mixta.addElement(new Integer(4)); lista_mixta.addElement(new Integer(2)); lista_mixta.addElement(new Integer(0)); // agregar 3 Strings al vector lista_mixta.addElement(new String("Pedro")); lista_mixta.addElement(new String("Juan")); lista_mixta.addElement(new String("Pablo")); // agregar 3 números de punto flotante al vector lista_mixta.addElement(new Float(1.1)); lista_mixta.addElement(new Float(2.2)); lista_mixta.addElement(new Float(4.4)); // extraer los enteros System.out.print("Los 3 enteros son :"); for (int i = 0; i < 3; i++) { Integer valor_int =(Integer) lista_mixta.elementAt(i); System.out.print(" " + valor_int); } System.out.println(); ________________________________________________________________________ Area de Computación, Universidad de La Serena 9 Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. // extraer los Strings System.out.print("Los 3 Strings son :"); for (int i = 3; i < 6; i++) { String valor_str =(String) lista_mixta.elementAt(i); System.out.print(" " + valor_str); } System.out.println(); // extraer los floats System.out.print("Los 3 floats son :"); for (int i = 6; i < 9; i++) { Float valor_float =(Float) lista_mixta.elementAt(i); System.out.print(" " + valor_float); } System.out.println(); } } Otra aplicación es la siguiente Vector son especialmente convenientes de usar para cuando Ud. desea mantener una lista de sus propios tipos de objetos, incluso aquellas de su propia invención descienden de la clase Object , por eso repetimos que Vector puede ser usado con objetos de cualquier tipo. Por ejemplo, si queremos mantener una guía de teléfono, cada entrada deberá contener un nombre y numero. Este segmento de programa debería ser el más apropiado. class Entrada { String nombre; String numero; // constructor Entrada( String nom, String num ) { nombre = nom; numero = num; } // varios otros metodos . . . } Un ejemplo concreto. import java.util.* ; import java.io.*; ________________________________________________________________________ 10 Area de Computación, Universidad de La Serena Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. class Entrada { String nombre; String numero; // constructor Entrada( String n, String num ) { nombre = n; numero = num; } // metodos public boolean equals( Object otro ) { return nombre.equals( ((Entrada)otro).nombre ); } public String toString() { return "Nombre: " + nombre + " Numero: " + numero; } } class GuiaFonoTest { public static void main ( String[] args) throws IOException { Vector fono = new Vector( 10 ); fono.addElement( fono.addElement( fono.addElement( fono.addElement( fono.addElement( new new new new new Entrada( Entrada( Entrada( Entrada( Entrada( "Ana", "123-4567") ); "Boris”, "123-6780") ); "Alberto", "789-1234") ); "Debora", "789-4457") ); "Jose", "446-0210") ); // Mirada para Jose en fono usando el método equals() int resul = fono.indexOf( new Entrada( "Jose", "") ) ; System.out.println( "indexOf returns: " + resul ) ; } } La salida es: Una aplicación más realista para la guía telefónica es el siguiente programa. import java.util.* ; import java.io.*; ________________________________________________________________________ 11 Area de Computación, Universidad de La Serena Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. class Entrada { String nombre; String numero; // constructor Entrada( String n, String num ) { nombre = n; numero = num; } // metodos public boolean equals( Object otro ) { return nombre.equals( ((Entrada)otro).nombre ); } public String toString() { return "Nombre: " + nombre + " Numero: " + numero; } } class GuiaFonoApp { public static void main ( String[] args) throws IOException { Vector fono = new Vector( 10 ); fono.addElement( fono.addElement( fono.addElement( fono.addElement( fono.addElement( new new new new new Entrada( Entrada( Entrada( Entrada( Entrada( "Ana", "123-4567") ); "Boris", "123-6780") ); "Alberto", "789-1234") ); "Debora", "789-4457") ); "Zara", "446-0210") ); String nombre; BufferedReader stdin = new BufferedReader( new InputStreamReader( System.in ) ); System.out.print("Ingrese el nombre -->"); nombre = stdin.readLine().trim(); while( !nombre.equals("quit" ) ) { int resul = fono.indexOf( new Entrada( nombre, "") ) ; if ( resul >= 0 ) System.out.println( fono.elementAt( resul ) ) ; else System.out.println( nombre + " no fue encontrado" ) ; System.out.print("Ingrese el nombre -->") ; nombre = stdin.readLine().trim() ; } } } ________________________________________________________________________ 12 Area de Computación, Universidad de La Serena Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Enumeration Enumeration es una interfaz que le permite recorrer los elementos uno a uno. La aplicación siguiente permite recorrer todos los elementos de una Hashtable desplegándolos uno a la vez. elements() // Returns una enumeracion de los componentes de un vector. Si tiene un objeto enumeration, los métodos hasMoreElements() nextElement() son usados para desplazarse a través de los elementos: boolean hasMoreElements()// return true si no todos los elementos han sido visitados. Object nextElement() // Returns el siguiente elemento de la enumeration. y Programa para imprimir los datos de un Vector usando la interface Enumeration import java.util.* ; class VectorEg6 { public static void main ( String[] args) { Vector nom = new Vector( 10 ); nom.addElement( nom.addElement( nom.addElement( nom.addElement( nom.addElement( nom.addElement( nom.addElement( nom.addElement( "Ana" ); "Boris" ); "Christian" ); "Debora" ); "Elena" ); "Frank" ); "Gabriel" ); "Alberto" ); Enumeration enum = nom.elements(); while ( enum.hasMoreElements() ) System.out.println(enum.nextElement()); } } ________________________________________________________________________ 13 Area de Computación, Universidad de La Serena Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. import java.util.*; // clase para almacenar los datos de los alumnos class RegAlumno { String nombre; String telefono; float promedio; RegAlumno(String nuevo_nombre, String nuevo_telefono, float nuevo_promedio) { nombre = new String(nuevo_nombre); telefono = new String(nuevo_telefono); promedio = nuevo_promedio; } public String toString() { return("Nombre: " + nombre + "\nTelefono No: " + telefono + "\nPromedio: " + promedio); } } public class hashing_alumnos { public static void main(String args[]) { Hashtable lista_alumnos = new Hashtable(); lista_alumnos.put("575-17-2351", new RegAlumno("Juan Pérez", "555-2310", 4.0f)); lista_alumnos.put("243-67-0201", new RegAlumno("Pedro López", "555-6104", 3.1f)); lista_alumnos.put("923-55-9124", new RegAlumno("José Martínez","555-3434", 2.7f)); lista_alumnos.put("123-95-7934", new RegAlumno("María Sánchez","555-0017", 3.9f)); /* extraer un alumno RegAlumno alumno = ________________________________________________________________________ 14 Area de Computación, Universidad de La Serena Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. (RegAlumno) lista_alumnos.get("243-67-0201"); System.out.println("Alumno número 243-67-0201:"); System.out.println(alumno); */ // extraer todos los registros de alumnos Enumeration enum = lista_alumnos.elements(); while(enum.hasMoreElements()) { RegAlumno alumno =(RegAlumno) enum.nextElement(); System.out.println(alumno); } } } Actividad Con todos los elementos vertidos. Construir un Frame que muestre los distintos métodos visto hasta aquí, en lo que se refiere a Vector. Los métodos a considerar deberían ser: add(), remove(), first(), last(), IsEmpty(), trim(). Así debería verse, mas o menos, la interfaz gráfica. ________________________________________________________________________ 15 Area de Computación, Universidad de La Serena Programación OO Anexo2: Vector y Enumeración Dr. Eric Jeltsch F. Esto se obtiene para cuando presiono Desplegar. ________________________________________________________________________ 16 Area de Computación, Universidad de La Serena