sábado, 14 de julio de 2012

3.4.1 Colecciones


Colecciones
Java tiene matrices para almacenar grupos de datos de tipo similar, que son muy útiles para modelos simples de acceso a datos. Sin embargo, las Colecciones oenumeraciones ofrecen una manera más completa y orientada a objetos para almacenar conjuntos de datos de tipo similar.

Las Colecciones tienen su propia asignación de memoria y posibilidad de una nueva asignación para ampliarlas. Tienen interfaces de método para su iteración y recorrido. Se pueden indexar mediante algo más complejo y útil que los simples enteros.

Cuando hemos utilizado en Java algún arreglo, ya sea de datos primitivos o de Objetos, ha sido necesaria la definición inicial del número de elementos a crear en el arreglo, para posteriormente hacer el recorrido desde la primera posición que tiene un valor (ya sea un dato primitivo o un objeto) hasta la última posición en el arreglo.

Si en el momento que estamos utilizando un arreglo, ya sea en un applet o en una aplicación, requerimos que el arreglo se extienda, esto sería posible solamente si hacemos una creación de un nuevo arreglo más grande, pasando todos los elementos del viejo arreglo al nuevo, recrear el viejo arreglo y volver a hacer toda la asignación de elementos, para que así todos los elementos vuelvan a estar en el mismo arreglo, y este pueda reutilizarse sin mayor problema en todos los métodos del applet o aplicación.

Como podemos observar esto sería algo complicado, veamos un ejemplo, tomando en cuenta que arreglo1 es nuestro arreglo de enteros que queremos engrandecer (al doble por ejemplo):

// creamos un nuevo arreglo
int arreglo2[] = new int[arreglo1.length];
// guardamos los valores del viejo arregloen el nuevo
for (int i=0; i< arreglo1.length; i++) {
arreglo2[i] = arreglo1[i];
}
// creamos arreglo1 de nuevo
int arreglo1[] = new int[arreglo2.length * 2];
// pasamos los valores del Nuevo arreglo al Viejo
// que ha sido creado de Nuevo
for (int i=0; i< arreglo2.length; i++) {
arreglo1[i] = arreglo2[i];
}
Ya podemos volver a utilizar el arreglo1 pero ahora con el doble de capacidad que antes.
Obviamente esto no sería muy útil, ya que requiere tiempo de ejecución y requiere estar revisando si ya se completo o no la capacidad del arreglo.

Las colecciones manejan este tipo de anomalías en forma transparente, ya que una colección tiene definida una capacidad inicial y Java crea de nuevo la colección para hacerla más grande y asigna de nuevo los valores, en forma transparente.
Utilicemos una de las colecciones que maneja Java:

La clase Vector

Un Vector es una matriz ampliable de referencia a objeto. Internamente, unVector implementa una estrategia de crecimiento para minimizar la reasignación y el espacio desperdiciado. Los objetos se pueden almacenar al final de un Vectorutilizando el método addElement() o en un índice dado mediante el métodoinsertElement(). Se puede almacenar una matriz de objetos en un Vectorutilizando el método copyInto(). Una vez se ha almacenado un conjunto de objetos en un Vector, se puede utilizar para buscar un elemento en concreto utilizando los métodos contains()indexOf() o lastIndexOf(). También se puede extraer un objeto de una posición específica de un Vector utilizando los métodos elementAt(),firstElement() y lastElement().

Los constructores de la clase Vector (perteneciente al paquete java.util) son:


Al crear un objeto de la clase Vector, uno puede no definir parámetros, en cuyo caso inicia con 10 elementos, que inicie con una cierta capacidad, que empiece con elementos de alguna otra colección, etc.

Entre algunos de los métodos de la clase están:


Para añadir elementos al objeto, dichos elementos deben ser objetos, es decir suponiendo que tenemos Vector vec = new Vector(); anteriormente definido, no podemos hacer:
vec. add(3); // esto es un grave error el 3 no es un objeto
para poder añadir un 3 como objeto debemos utilizar la ayuda de la clase Integer:
// esto ya añade un objeto entero al objeto de la clase Vector
vec. add( new Integer(3) );
También hay otros métodos a saber:

El método get nos ayuda a obtener un objeto en específico, dando como parámetro el índice, también existe el remove y el removeAll, el método remove elimina un específico objeto, mientras que el removeAll borra todos los elementos del vector.
A continuación observaremos un applet hecho anteriormente que nos servirá para crear un objeto de la clase Vector que tenga solamente números enteros, como lo habíamos hecho anteriormente, pero en aquel ejemplo tuvimos que utilizar un contador para saber cuantos elementos teníamos en el arreglo, ahora eso no será necesario, pues existe el método size() como se ve en la figura abajo, que nos ayuda a ver cuantos elementos hay en el objeto:


Veamos el applet, este sería como el definido abajo:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.Vector;

// <applet width="400" height="200" code="AppletArreglos1"></applet>

public class AppletArreglo3 extends Applet implements ActionListener{
Label l1, l2;
Button b1, b2,b3,b4;
TextField t1;
TextArea ta1;
Vector vector;
Panel p1, p2,p3;

public AppletArreglo3() {
l1 = new Label("Numero");
l2 = new Label("Texto para ver Vector");
t1 = new TextField(8);
ta1 = new TextArea(10,20);
b1 = new Button("Añade");
b2 = new Button("Muestra Vector");
b3 = new Button("Limpia Vector");
b4 = new Button("Limpia Campos");
p1 = new Panel(new GridLayout(2,1,5,5));
p2 = new Panel(new FlowLayout());
p3 = new Panel(new GridLayout(2,2,5,5));
setLayout(new GridLayout(3,1,5,5));
p1.add(l1);
p1.add(t1);
p2.add(l2);
p2.add(ta1);
p3.add(b1);
p3.add(b2);
p3.add(b3);
p3.add(b4);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
vector = new Vector();
add(p1);
add(p2);
add(p3);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b1) {
vector.add(new Integer(t1.getText()));
t1.setText("");
}
if (ae.getSource() == b2) {
ta1.setText("");
for (int i=0; i < vector.size(); i++) {
ta1.append("" + vector.get(i).toString() + "\n");
}
}
if (ae.getSource() == b3) {
vector = new Vector();
}
if (ae.getSource() == b4) {
t1.setText("");
ta1.setText("");
}
}
}

Para revisar que hace el applet veamos algunos ejemplos de su ejecución:





Observemos como para crear el objeto utilizamos la instrucción:
arreglo = new Vector();

Para definir un nuevo elemento utilizamos la instrucción:
arreglo.add(new Integer(t1.getText()));

es importante aquí hacer notar que el método getText() nos regresa un objeto de la clase String (si observamos la definición del método en la clase TextField), en la clase Integer podemos observar que se puede crear un objeto con un String, y entonces estamos añadiendo un objeto al objeto arreglo de la clase Vector.
Para recorrer todo el arreglo podemos utilizar un ciclo que empieza en cero, al igual que un arreglo, un objeto de la clase Vector inicia en cero y puedes utilizar el cero como índice, es por eso que para recorrer el objeto utilizamos:
for (int i=0; i < arreglo.size(); i++) {
ta1.append("" + arreglo.get(i) + "\n");
en cada renglón del objeto ta1 (TextArea) añadimos el valor del objeto, veamos que es lo mismo utilizar esto que tomar el método toString (definido en toda clase) para pasar el valor String del objeto, es decir el applet hubiera funcionado igual si hubiéramos definido las siguientes instrucciones:
for (int i=0; i < arreglo.size(); i++) {
ta1.append("" + arreglo.get(i).toString() + "\n");

Esto debería ser la mejor manera de definirlo, pero debemos asegurarnos que la clase que estamos utilizando tenga el método toString definido, analicemos que hace Java.

Cuando Java encuentra:

arreglo.get(i).toString()

primero utiliza el método get() pasándole el valor de i, y eso hace que se regrese un objeto de la clase Integer, ya que es lo que le estamos añadiendo, posteriormente arreglo.get(i) es realmente un objeto de la clase Integer, entonces al utilizar el método toString() lo que estamos haciendo es hacer uso del método toString() de la clase Integer.
En la siguiente sección analizaremos esto, al revisar otros objetos.

2 comentarios:

  1. El servidor donde las tenia alojado, me las ha borrado... eso pasa por usar servicios gratuitos :(

    ResponderEliminar