Genericos en Java

He estado tratando de entender para qué sirve la programación genérica… muchos autores y usuarios de Java (a partir de la versión 5) hablan maravillas y demás.

Bueno, en este caso voy a tratar de programar el algortimo quicksort usando genéricos para el caso de Java.

Primero, agradecer a la profesora Claudia Zapata de la PUCP, quien me ha guiado en este proceso.

Se comenzará con la parte teórica, para este caso la lectura recomendada aquí.

Les comento que encontré un código para programar grafos, donde se codea dos interfaces, una para declarar los vértices genéricos  y otra para las aristas genéricas. Al final se implementaba una clase para definir el tipo de dato del vértice, número o letra por ejemplo y, finalmente otra método para pintar el grafo (del paper de Garcia 2007):

public interface VertexListGraph<Vertex,
VertexIterator extends Collection<Vertex>,
VerticesSizeType extends Integer>{
VertexIterator vertices();
VerticesSizeType num_vertices();
}
public interface IncidenceGraph<Vertex, Edge,
OutEdgeIterator extends Collection<Edge>,
DegreeSizeType extends Integer> {
OutEdgeIterator out_edges(Vertex v);
DegreeSizeType out_edges(Vertex v);
}
public class adjacency_list
implements VertexListGraph<Integer,Collection<Integer>, Integer>,
IncidenceGraph<Integer,adj_list_edge<Integer>,
Collection<adj_list_edge<Integer>, Integer>
{
}
breadth_first_search.go(g,scr,color_map,visitor);
public class breath_first_search{
public static <
GraphT extends VertexListGraph<Vertex, VertexIterator, ?> & IncidenceGraph
<Vertex,Edge,OutEdgeIterator, ?>, Vertex,
Edge extends GraphEdge<Vertex>,
VertexIterator extends Collection<Vertex>,
ColorMap extends ReadWritePropertyMap<Vertex,Color Value>,
Visitor extends BFSVisitor<GraphT, Vertex, Edge>>
OutEdgeIterator extends Collection<Edge>,
void go (GraphT g, Vertex s, ColorMap c, Visitor vis);
}

Luego de este paréntesis, volvamos al ejemplo de Mundo Geek, donde se puede apreciar claramente que declara una clase genérica pública que tiene el método imprimir_reves; luego crea un buffer para almacenar un string (esto quiere decir que cualquiera fuere el tipo de datos que le demos a nuestro objeto lo convertirá en String).

Finalmente, en el programa crea nuevos objetos a los que se debe especificar el tipo, y el método declarado en la interfaz genérica puede ser llamado con el correspondiente objeto, el cual repito: acaba de tener un tipo específico.

Sin más preámbulos, el código del quicksort con genéricos en Java adaptado de esta page:

import java.util.List;
 import java.util.Vector;
public class Quicksort<T extends Comparable<T>> {
public void sort(List<T> lista){
 sort(lista, 0, lista.size() - 1);
 }
public void sort(List<T> lista, int start, int end){
 int i = start; /** Indice para iniciar la búsqueda desde la izquierda **/
 int k = end; /** Indice para iniciar la búsqueda desde la derecha **/
if ((end - start) >= 1){
 T pivot = lista.get(start); /** Pivote para realizar la comparación, escogemos el primer elemento **/
while (i < k){ /** Mientas el índice izquierdo sea menor al derecho **/
 while (lista.get(i).compareTo(pivot) <= 0 && i < end && k > i){
 i++; /** Recorriendo desde la izquierda nos ubicamos hasta encontrar el primer elemento mayor al pivote **/
 }
 while (lista.get(k).compareTo(pivot) > 0 && k >= start && k >= i){
 k--; /** Recorriendo desde la derecha nos ubicamos hasta encontrar el primer elemento menor al pivote **/
 }
 if (i < k){ /** Si el índice izquierdo sigue siendo menor, intercambiamos los elementos **/
 intercambiar(lista, i, k);
 }
 }
 intercambiar(lista, start, k);
sort(lista, start, k - 1);
 sort(lista, k + 1, end);
 }else{
 return; /** Cuando solo quede por ordenar un elemento se sale de la función **/
 }
 }
private void intercambiar(List<T> lista, int i, int j){
 T temp = lista.get(i);
 lista.set(i, lista.get(j));
 lista.set(j, temp);
 }
/**
 * @param args
 */
 public static void main(String[] args) {
 Quicksort<Integer> quicksort = new Quicksort<Integer>();
 /** Prueba **/
 List<Integer> listaPrueba = new Vector<Integer>();
 listaPrueba.add(new Integer(7));
 listaPrueba.add(new Integer(1));
 listaPrueba.add(new Integer(4));
 listaPrueba.add(new Integer(9));
 listaPrueba.add(new Integer(3));
 listaPrueba.add(new Integer(2));
 listaPrueba.add(new Integer(8));
 listaPrueba.add(new Integer(5));
 listaPrueba.add(new Integer(10));
 listaPrueba.add(new Integer(6));
System.out.println("Antes de ordenar");
 for (Integer i : listaPrueba){
 System.out.println(i.intValue());
 }
quicksort.sort(listaPrueba);
System.out.println();
 System.out.println("Después de ordenar");
 for (Integer i : listaPrueba){
 System.out.println(i.intValue());
 }
 }
 }

Esta manera no es tan óptima, aunque usemos Genéricos para Array, Genéricos para List u otras estructuras comunes. Lo ideal es utilizar Collection la cual lleva la librería import java.util.Collection;

Espero pronto terminar de estudiar bien bien los conceptos e implementaciones para poder publicar el nuevo código. See U guys🙂

About Julita Inca

Ingeniero de Sistemas UNAC, Magíster en Ciencias de la Computación PUCP, OPW GNOME 2011, Miembro de la GNOME Foundation desde el 2012, Embajadora Fedora Perú desde el 2012, ganadora del scholarship of the Linux Foundation 2012, experiencia como Admin Linux en GMD y Especialista IT en IBM, con certificaciones RHCE, RHCSA, AIX 6.1, AIX 7 Administrator e ITILv3. Experiencia académica en universidades como PUCP, USIL y UNI. HPC researcher, a simple mortal, like you!
This entry was posted in τεχνολογια :: Technology, Programming and tagged , , , , . Bookmark the permalink.

One Response to Genericos en Java

  1. Muchas gracias por comnpartir el código, me ha servido mucho.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s