ArrayList

La clase ArrayList (java.util) es una objeto lista que implemente la interfaz Collection de java. Esta clase permite contener y ordenar objetos, incluso, puede almacenar objetos dupicados. Su tamaño es dinámico, es decir, esta lista crecera a medida que se inserten en ella mas elementos. Debememos recordar que el índice de un ArrayList empieza en 0, es decir, el primer elemento del ArrayList tiene como índice el 0

Nota: Los objetos ArrayList se comportan igual que un objeto Vector desincronizado, por lo tanto, un ArrayList se ejecuta mas rápido que un Vector, ya que el ArrayList no tiene que implementar los métodos de sincronización de procesos.

Agregar elementos
El ArrayList contendrá diversos elementos que debemos gestionar, para agregar elementos, se puede hacer de dos formas usando el método add(…) que recibe por parámetro un objeto de tipo Object:

• La primera forma sería insertalo sin darle una posición específica, entonces, por defecto el elemento será agregado al final:

// instanciamos un nuevo ArrayList
ArrayList mi_lista = new ArrayList();

// agregamos el elemento, por defecto lo agregará de último
mi_lista.add("elemento 1");

• La segunda forma sería dandolé una posición específica en el la lista. Si se dá el caso de que el elemento que vamos a insertar en un índice donde ya hay un elemento, la lista, por definicion el elemento insertado y todos a la derecha de él se correrán una posición a la derecha:

// instanciamos un nuevo ArrayList
ArrayList mi_lista = new ArrayList();

// agregamos el elemento, por defecto lo agregará de último
mi_lista.add(1, "elemento A");

Eliminar Elementos
Para eliminar elementos se dispone de el método remove(…) en el cual se recibe como argumento el objeto (sí, el objeto) o eleminar el elemento conociendo su indice el índice (posición).
Para este ejemplo supongamos que tenemos una clase Persona, que tiene nombre y edad, insertaremos unos cuantas personas en la lista y luego eliminaremos una de ellas usando las dos formas

• Eliminado según su índice en la lista


Persona persona_1 = new Persona("Julian", 20);
Persona persona_2 = new Persona("Bety", 17);
Persona persona_3 = new Persona("Marta", 22);

ArrayList mi_lista = new ArrayList();

// agregamos unos cuantos elementos
mi_lista.add(persona_1);
mi_lista.add(persona_2);
mi_lista.add(persona_3);
// la estructura de a lista ha quedado asi: 0 = [Julian] 1 = [Bety] 2 = [Marta]

// si queremos eliminar a "Betty" por su índice seria asi:
mi_lista.remove(1) // el 1 pertenece al índice o posicion de Betty en la lista
// la estructura de a lista ha quedado asi: 0 = [Julian] 1 = [Marta]

Marta ha pasado a la posición 1, ya que la lista forza a correr todos los elemenetos a al izquieda para que ocupe ese espacion eliminado, entonces el tamaño de la lista se reduce a 2 elementos únicamente

• La otra forma sería si le enviamos el objeto para que la lista lo identifique. Aclaro, ingresar un nuevo elemento con los mismos datos no significa que sea le mismo elemento, para que deba ser igual deber tener la misma instancia y/o la misma posición en memoria


Persona persona_1 = new Persona("Julian", 20);
Persona persona_2 = new Persona("Bety", 17);
Persona persona_3 = new Persona("Marta", 22);

ArrayList mi_lista = new ArrayList();

// agregamos unos cuantos elementos
mi_lista.add(persona_1);
mi_lista.add(persona_2);
mi_lista.add(persona_3);
// la estructura de a lista ha quedado asi: 0 = [Julian] 1 = [Bety] 2 = [Marta]

// si queremos eliminar a "Julian" debemos "enviarle a Juan" de nuevo
mi_lista.remove(persona_1) // se envia la instancia de Juan
// la estructura de a lista ha quedado asi: 0 = [bety] 1 = [Marta]

Otras funciones importantes

• Para determinar la cantidad de elementos de la lista solo se llama al metodo size()

int total = mi_lista.size();

• Para vaciar la lista y dejarla sin ningún elemento en ella se usa el método clear()

mi_lista.clear();

• Para saber si un objeto ésta insertado en lista usamos el método contains(…), el cual devuelve true si existe o un false si sucede lo contrario

boolean existencia = mi_lista.contains(elObjetoBuscado);

• Para saber si la lista esta vacía, es decir, si no tiene elementos usamos isEmpty() que devuelve true si NO hay elementos o un false si contiene algun elemnto.

boolean vacia = mi_lista.isEmpty();

• Para pasar o copiar los elementos a un arreglo de objetos (TipoObjeto objetos []) se usa el método toArray()

Object objetos [] = mi_lista.toArray();

IndexOf(Object o)
Esta función retorna la posición de un elemento que está en el array.

Persona a = new Persona ("Juan");
mi_lista.add(a);
Persona b = new Persona ("Marta");
mi_lista.add(b);
Persona c = new Persona ("Andrea");
mi_lista.add(c);

//retorna 2
int indice = mi_lista.indexOf(b);

addAll(Collection c)
Este método se encarga de anexar un arraylist a otra ya creado. Pero también se puede aplicar a otro tipo de listas que implementen la interfaz Collection.

ArrayList otra_lista = new ArrayList();
Persona d = new Persona ("Carlos");
otra_lista.add(d);
Persona e = new Persona ("Samuel");
otra_lista.add(e);

mi_lista.addAll( otra_lista );
Read More

Metodos genéricos en java

Sería interesante si nosotros pudiéramos programar un metodo simple de ordenamiento que puediera ordenar los elementos en una estructura de datos (ArrayLists, Array, LinkedList) en el que sólo haya objetos Integer, o una estructura de datos de solo String, o cualquier otra estructura que soporta ordenamiento (donde los elementos pueden ser comparados).
Lo importante de esto es que seria también interesante redefinir una una clase de tipo de estructura de datos donde se podría detectar automaticamente su contenido, es decir, si tenemmos una lista de elementos de solo Integer, que a la hora de tratar de ingresar un String que nos muestre un mensaje o incluso un error de compilación que nos diga que esa lista solo pueden haber del tipo de elemento requerido

Nosotros podríamos crear un método génerico para el ordenamiento de objetos en una lista, que invoque a su respectivo método génerico para lista de Integer, lista String, lista de doble, y asi segun cada tipo. Entonces el compilador tiene la tarea de revisar el tipo de elemento que esta en la lista y éste se encarga de llamar a su método de ordenamiento para los objetos de ese tipo.

La clase MetodosSobrecargados ofrece una serie de tareas con operaciones similares en diferente tipos de datos. Para ilustrar los métodos genericos veamos el ejemplo de abajo, que contiene tres métodos sobrecargados llamados imprimirLista (lineas 7-13, lineas 16-22 y lineas 25-31). Estos métodos imprimen en representación de String los elementos de una lista de Integer, una lista de double y una lista de Character para poner a trabajar los métodos genericos, porque solo los tipos de referencia pueden ser usados con los métodos genéricos.

// Ejemplo de metodos sobrecargados
// Uso de metodos sobrecargados para imprimer listas de diferentes tipos

public class MetodosSobrecargados
{
   // metodo imprimirLista que imprime una lista de Integer
   public static void imprimirLista( Integer[] lista )
   {
      for ( Integer elemento: lista )
         System.out.printf( "%s ", elemento);

      System.out.println();
   } // fin metodo imprimirLista

   // metodo imprimirLista que imprime una lista de Double
   public static void imprimirLista( Double[] lista )
   {
      for ( Double elemento: lista )
         System.out.printf( "%s ", elemento );

      System.out.println();
   } // fin metodo imprimirLista

   // metodo imprimirLista que imprime unalista de Character
   public static void imprimirLista( Character[] lista)
   {
      for ( Character elemento : lista )
         System.out.printf( "%s ", elemento);

      System.out.println();
   } // fin metodo imprimirLista

   public static void main( String args[] )
   {
      // creacion de listas de Integer, Double y Character
      Integer[] lista_integer = { 1, 2, 3, 4, 5, 6 };
      Double[] lista_double = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
      Character[] lista_caracter = { 'H', 'O', 'L', 'A' };

      System.out.println( "la lista de Integer  contiene:" );
      imprimirLista( lista_integer );
      System.out.println( "nla lista de doble contiene:" );
      imprimirLista( lista_doble); // pass a Double lista de
      System.out.println( "nla lista de Caracter contiene:" );
      imprimirLista( characterlista de ); // pass a Character lista de
   } // fin del metodo main
} // fin de la clase MetodosSobrecargados

La salida de la aplicación anterior seria algo como esto:

Array integerArray contains:
1 2 3 4 5 6

Array doubleArray contains:
1.1 2.2 3.3 4.4 5.5 6.6 7.7

Array characterArray contains:
H E L L O

Read More