You are on page 1of 6

COLECCIONES

Una colección es un objeto que reúne y organiza a otros objetos. Las


colecciones definen las diferentes maneras en las cuales los elementos de la
colección pueden ser accedidos y administrados. Las colecciones pueden ser
separadas en dos grandes categorías: Lineales y No lineales.

Orden de la colección

La organización de los elementos en una colección es usualmente determinada


por una de las siguientes criterios:

1. El orden en el cual fueron agregados los objetos


2. Alguna relación inherente entre los elementos

Tipos de Datos Abstractos TDA (Abtract Data Type ADT)

Una abstracción esconde o ignora ciertos detalles de un objeto, y solo se


enfoca en las características que hacen o componen al objeto en si.

La interface es una abstracción que nos permite controlar una implementación


de un objeto.

Una colección es una abstracción ya que se definen las operaciones que


deberían declararse en la interfaz para que los usuarios puedan acceder a ella y
usarla.
Los usuarios interactúan con la colección a través de la interface y los detalles
de cómo la colección es implementada están ocultos para el usuario

Operaciones para una colección de tipo conjunto

add Añade un elemento al conjunto


addAll Añade los elementos de un conjunto a otro
removeRandom Elimina un elemento aleatorio del conjunto
remove Elimina un elemento concreto del conjunto
union Combina los elementos de dos conjuntos para crear un tercero
contains Determina si un elementos concreto se encuentra dentro del
conjunto
equals Determina si dos conjuntos contienen los mismos elementos
isEmpty Determina si el conjunto esta vacío
size Determina el numero de elementos del conjunto
iterator Proporciona un iterador para el conjunto
ToString Proporciona una representación del conjunto en forma de cadena de
caracteres

Colección Java API

En la versión JSE de Java existen las definiciones de colecciones e interfaces,


entonces ¿por qué definir algo que ya existe? Debido a que el conjunto de colecciones
definidas en la versión JSE es un subconjunto de las colecciones que podremos
utilizar posteriormente y las clases que define JSE no son implementadas en la
manera que nosotros necesitaremos.
Colección Set

Nuestra colección se llamara Set la cual no contiene elementos duplicados,


asumimos que no cuenta con un orden establecido entre los elementos y es una
colección de tipo no lineal

A continuación se muestra una vista conceptual de la representación de una colección


de tipo Set

Las colecciones contienen operaciones en común las cuales solo varían en los
detalles, por lo tanto definiremos una clase la cual define todas las operaciones que
pueden aplicarse a cualquier colección sin dar detalles de cómo se deba implementar,
es decir utilizaremos una INTERFAZ.

INTERFACES

Una interface nos permite especificar un conjunto de métodos abstractos,


especificándose la signatura de cada método, pero no su cuerpo. Esta tarea se le deja
al usuario ya que la manera en que se manipula algún objeto de la colección varia un
poco dependiendo del tipo de colección que utilicemos.

Las interfaces también pueden ser del tipo genérico T. En los métodos de la
interfaz, el tipo de diversos parámetros y valores de retorno se suelen expresar
utilizando el tipo genérico T. Cuando la interfaz sea implementada, dicha
implementación se basara en el tipo por el cual se sustituya T.

Nuestra interface SetADT<T> se define a continuación, junto con todos las


operaciones que se le pueden realizar a nuestra colección de tipo conjunto
package jss2;
import java.util.Iterator;

public interface SetADT<T> {

/** Agrega un elemento a la colección, ignorando elementos


duplicados */
public void add (T element);

/** Remueve de manera aleatoria un elemento de la colección,


el elemento eliminado lo toma como valor de retorno*/
public T removeRandom ();

/** Elimina y Remueve de la colección un elemento en


especifico, el elemento eliminado lo toma como valor de
retorno*/
public T remove (T element);

/** Regresa la union de la colección con la colección que se


envía como parámetro */
public SetADT<T> union (SetADT<T> set);

/** Devuelve true si la colección contiene al parámetro */


public boolean contains (T target);

/**Devuelve true si la colección y el parámetro especificado


contienen los mismos elementos */
public boolean equals (SetADT<T> set);

/**Devuelve true si la colección esta vacía */


public boolean isEmpty();

/**Devuelve el numero de elementos que contiene nuestra


colección */
public int size();

/**Devuelve un Iterator para los elementos de esta colección


*/
public Iterator<T> iterator();

/**Devuelve una representación de este conjunto en forma de


caracteres*/
public String toString();

}
Iteradores

Un iterador es un objeto que provee la manera para iterar a través de la colección.


La interface Iterator esta definida en la librería de clases de JSE con los dos métodos
abstractos que son:

• hasNext()
Regresa trae si la colección tiene mas elementos
• next()
Regresa el próximo elemento en la iteración

Por el hecho de ser una interface significa que deja al usuario la


implementación de dicha clase como mejor nos convenga, por lo tanto debemos
cuidar los siguientes detalles.

Otra cuestión relativa al uso de los iteradores es qué sucede si se modifica la


colección mientras se esta utilizando el iterador. La mayoría de las colecciones de la
API Collections de java están implementadas con lo que se conoce con el nombre de
característica de fallo rápido. Esto simplemente significa que esas colecciones genera,
o deberían generar, una excepción si se modifica la colección mientras se esta
usando el iterador. Sin embargo, la documentación relativa a estas colecciones es
muy explicita al afirmar que este comportamiento no puede garantizarse.

Una manera de manejar este problema es hacer iteradores que permitan la


modificación concurrente, reflejándose dichos cambios en la iteración, así como
también la creación de iteradores que permiten reconocer una instantánea de la
colección, sobre la cual las modificaciones concurrentes no tienen ningún impacto.

Implementando una Colección con Arrays

¿Como implementar una Colección que es una estructura de datos NO lineal en


un array que es una estructura de datos lineal?

El hecho de que el array almacene los objetos en un orden concreto no es


relevante en este caso porque, en una colección de tipo conjunto, no hay ningún
orden definido entre los elementos. Por tanto, nuestra solución para implementar cada
operación de la colección de tipo conjunto no concederá ninguna relevancia al orden
en el que los objetos estén almacenados en la matriz.
¿Cómo administrar el hecho de que el tamaño de un Array es fijo?

Cuando utilizamos una matriz para implementar una colección, tenemos que
tener en cuenta la situación en la que todas las celdas de la matriz estén ya siendo
utilizadas para almacenar elementos y nosotros deseamos agregar un elemento mas.
A esta problemática se nos presentan las siguientes soluciones:

• Podemos implementar las operaciones que añaden un elemento a la colección


de tal manera que genere una excepción si la estructura de datos esta llena.
• Podemos implementar las operaciones add de modo que devuelvan un
identificador del estado que el usuario pueda comprobar para ver si la
operación add ha tenido éxito
• Podemos expandir automáticamente la capacidad de la estructura de datos
subyacentes cada vez que sea necesario, de modo que nunca podrá llegar a
estar llena