lunes, 28 de marzo de 2011
Publicado por Tecnonucleo @ 10:30  | Desarrollo Mobile
Comentarios (0)  | Enviar

La clase Vector en Java nos permite manipular un array de objetos cuya cantidad de elementos puede aumentar o disminuir dinámicamente. A continuación se presentan un par de extensiones realizadas a esta clase, poniendo foco especialmente en el desarrollo para la plataforma Java Microedition (Java ME).

ClsVector

ClsVector agrega un conjunto de métodos simples que se pueden utilizar para acceder a los elementos del vector obteniendo un tipo de dato específico. Esto nos evita tener que estar casteando constantemente los valores retornados.

Ejemplo de uso:

01     /**
02      * ClsVector example
03      */
04     private static void typedGetter() {
05         ClsVector arrOrderedVector;
06         String strValue;
07 
08         System.out.println("ClsVector example");
09         System.out.println();
10 
11         arrOrderedVector = new ClsVector();
12         arrOrderedVector.add("First");
13         arrOrderedVector.add("Second");
14         arrOrderedVector.add("Third");
15 
16         // Casting
17         strValue = (StringarrOrderedVector.get(1);
18         System.out.println(strValue);
19 
20         // Using a typed getter
21         strValue = arrOrderedVector.strGet(1);
22         System.out.println(strValue);
23     }

 

Estos métodos get tipificados son muy prácticos en el entorno Java ME, en donde no existe la posibilidad de utilizar programación genérica (generics).

ClsOrderedVector

En Java ME es imposible ordenar datos utilizando SQL y bases de datos relacionales, con lo cual un simple ordenamiento ascendente se puede tornar en todo un desafío.

La segunda extensión de la que se ocupa este artículo, llamada ClsOrderedVector, es una especialización derivada de la anterior, ClsVector. En ella se agrega todo el código necesario para poder ordenar los elementos alojados dentro del vector. Para poder hacerlo de una forma genérica, se construyó la interface IntComparator. El mecanismo de ordenamiento solo funcionará correctamente si todos los elementos son de un mismo tipo o al menos comparables entre sí. El algoritmo de ordenamiento utilizado es una implementación de QuickSort en lenguaje Java desarrollada por Sun Microsystems hace ya algunos años.

Ejemplo de uso:

Este segundo ejemplo va a ser un poco más sofisticado. Para el mismo se creó una nueva clase ClsPerson, cuyas instancias serán ordenadas dentro del vector. También se creó ClsPerson_Name_Comp que implementa la interface IntComparator.

Nótese la existencia de una relación muy estrecha entre la clase ClsPerson y el comparador ClsPerson_Name_Comp. Es por este motivo que el nombre elegido para el comparador comienza justamente con el nombre de la clase a la cual debe comparar. Por convención, la segunda parte del nombre indica la propiedad que se utiliza para la comparación (ordenamiento), y la última parte siempre es Comp para denotar que se trata de un comparador.



Código:


01     /**
02      * ClsOrderedVector example
03      */
04     private static void sorting() {
05         ClsPerson objPerson;
06         ClsPerson_Name_Comp objPerson_Name_Comp;
07         ClsOrderedVector arrOrderedVector = new ClsOrderedVector();
08 
09         System.out.println("ClsOrderedVector example");
10         System.out.println();
11 
12         // Create the vector elements
13         objPerson = new ClsPerson();
14         objPerson.setMstrName("Andrés");
15         arrOrderedVector.add(objPerson);
16 
17         objPerson = new ClsPerson();
18         objPerson.setMstrName("Vanesa");
19         arrOrderedVector.add(objPerson);
20 
21         objPerson = new ClsPerson();
22         objPerson.setMstrName("Emiliano");
23         arrOrderedVector.add(objPerson);
24 
25         objPerson = new ClsPerson();
26         objPerson.setMstrName("Carolina");
27         arrOrderedVector.add(objPerson);
28 
29         // Create and set the comparator
30         objPerson_Name_Comp = new ClsPerson_Name_Comp();
31         arrOrderedVector.setMobjComparator(objPerson_Name_Comp);
32 
33         // Sort the elements
34         arrOrderedVector.sort();
35 
36         // Show the sorted elements
37         for (int i = 0; i < arrOrderedVector.size(); i++) {
38             objPerson = (ClsPersonarrOrderedVector.get(i);
39             System.out.println(objPerson.getMstrName());
40         }
41     }

 

Se podrían crear más comparadores para ClsPerson si la clase tuviera otras propiedades por las cuales fuera necesario ordenar, o si se deseara realizar un ordenamiento descendente además de del ascendente mostrado en este ejemplo. El comparador asignado a un ClsOrderedVector puede cambiarse tantas veces como sea necesario llamando al método ClsOrderedVector.setMobjComparator(), pero hay que tener en cuenta que para que el ordenamiento realmente se ejecute es necesario llamar al método ClsOrderedVector.sort() que es el que realmente realiza el trabajo de ordenar el contenido del vector.

Una forma alternativa de mantener los datos ordenados dentro de un vector en principio vacío es primero setear el comparador adecuando  para luego ir insertando los elementos con el método ClsOrderedVector.orderedInsert().

Recursos

Este Zip incluye las clases analizadas, el código de ejemplo que las implementa, la documentación JavaDoc, y el proyecto para importar desde Eclipse:
Descargar

Implementación del agoritmo QuickSort realizada por Sun Microsystems:
http://java.sun.com/applets/jdk/1.4/demo/applets/SortDemo/QSortAlgorithm.java

 



Tags: Vector, J2ME, Array, Order, Quicksort, Sort, Java Microedition

Comentarios