domingo, 10 de marzo de 2019

Ordenamiento mezcla natural: objetos

Como ejemplo final en esta serie, veremos cómo ordenar un objeto que nosotros definimos. Vamos usar un objeto Persona que tiene nombre y edad. El único requisito para poder ordenarlo es que podamos compararlo. Esto lo logramos implementando el método compareTo() de la interface Comparable, nuestra implementación ordenará primero por edad y luego por nombre.

Las implementaciones de Lector y Escritor son exactamente iguales a las del ejemplo anterior en donde ordenamos enteros grandes.

Para crear nuestro archivo de prueba, leemos nuestro archivo de texto con nombres y a cada nombre le asignamos una edad para crear un objeto Persona. Noten que la clase Persona también implementa la interface Serializable. Esta interface no requiere que implementemos ningún método y nos permite serializar el objeto para escribirlo y leerlo de archivos.

Espero que los ejemplos en esta serie sirvan como base por si desean ordenar otro tipo de datos.

$ javac MezclaNaturalGenerico.java MezclaNaturalEjemplo4.java
$ java MezclaNaturalEjemplo4
Error en el ordenamiento
Fusion 1
Fusion 2
...
EL ARCHIVO ESTA ORDENADO
MezclaNaturalEjemplo4.java

domingo, 3 de marzo de 2019

Ordenamiento mezcla natural: enteros grandes

Ahora veremos como ordenar enteros grandes con el algoritmo genérico de mezcla natural. Este ejemplo es muy parecido al primer ejemplo donde ordenamos cadenas binaria. Pero en lugar de usar Data[Input|Ouput]Stream ahora usamos Object[Input|Output]Stream. Esto nos permite leer y escribir objetos serializados en lugar de sólo datos primitivos.

La principal diferencia, que me tomó por sorpresa, es que el método available() no regresa 0 para indicar fin del archivo. En este caso, tenemos que capturar EOFException para detectar cuando acabamos de leer los datos.

El programa crea y ordena un archivo con 100,000 enteros.

$ javac MezclaNaturalGenerico.java MezclaNaturalEjemplo3.java
$ java MezclaNaturalEjemplo3
Error en el ordenamiento
Fusion 1
Fusion 2
...
EL ARCHIVO ESTA ORDENADO
MezclaNaturalEjemplo3.java

sábado, 2 de marzo de 2019

Ordenamiento mezcla natural: cadenas

La versión original de este algoritmo ordena cadena binarias porque fue un requerimiento del proyecto. Pero ahora que ya tenemos la versión genérica, podemos ordenar otros datos. Empecemos por ordenar cadena simples (no binarias). Nuestro archivo de entrada tiene un nombre por línea.

Noten que en el Lector tenemos que obtener la línea por adelantado para poder implementar adecuadamente hasNext().

Después de ejecutar el ejemplo, pueden corroborar el resultado abriendo el archivo nombres_copia.txt.

$ javac MezclaNaturalGenerico.java MezclaNaturalEjemplo2.java
$java MezclaNaturalEjemplo2
MezclaNaturalEjemplo2.java