- Algoritmo original.
- Algoritmo genérico.
- Ordenando cadenas binarias.
- Ordenando cadenas.
- Ordenando enteros grandes.
- Ordenando objetos.
Ahora veremos cómo usar el algoritmo genérico de mezcla natural con cadenas binarias. Tenemos que implementar las dos interfaces que permiten aislar los detalles de lectura y escritura de datos.
public static class Lector implements MezclaNaturalGenerico.Lector<String> public static class Escritor implements MezclaNaturalGenerico.Escritor<String>
La implementación de estas dos interfaces es bastante directa. Por ejemplo, el método next() ecapsula readUTF() y el método hasNext() encapsula dis.available() != 0. También comentaba que el algoritmo se inicializa con fábricas para generar Lectores y Escritores. Eso lo podemos ver en esta línea:
new MezclaNaturalGenerico<>(Lector::new, Escritor::new);
Vale la pena explicar qué está pasando aquí. La forma extendida sería implementar la interface que está esperando el constructor.
static class FabricaLectores implements Function<File, MezclaNaturalGenerico.Lector<String>> { @Override public MezclaNaturalGenerico.Lectorapply(Object o) { return new Lector(o); } }
Y la usamos así:
new MezclaNaturalGenerico<>(new FabricaLectores(), ...);
La parte principal de FabricaLectores es new Lector(o), lo demás sólo causa ruido. Dado que Function es una interface funcional, es decir, que sólo tiene un método abstracto, la podemos reemplazar con una lambda.
new MezclaNaturalGenerico<>(o -> new Lector(o), ...)
Pero como la única instrucción de la lambda es un new, la podemos reemplazar por una referencia al constructor. Y así es cómo llegamos al resultado final.
new MezclaNaturalGenerico<>(Lector::new, ...);
Al ejecutar este ejemplo deben obtener lo siguiente:
$ javac MezclaNaturalGenerico.java MezclaNaturalEjemplo1.java $ java MezclaNaturalEjemplo1 Error en el ordenamiento Fusion 1 ... EL ARCHIVO ESTA ORDENADO 1) AARON 2) ABBEY 3) ABBIE 4) ABBY 5) ABDUL ...MezclaNaturalEjemplo1.java