Imprimir
Categoría: Java
Visto: 7871

En PC Resumen vamos a hablar de los diferentes tipos de algoritmos que existen en Java para las colecciones, en concreto del algoritmo sort. El marco de trabajo de colecciones cuenta con varios algoritmos de alto rendimiento para manipular los elementos de una colección. Estos algoritmos se implementan como métodos estáticos de la clase Collections. Los algoritmos min, max, addAll, frequency y disjoint operan con objetos Collection. Los algoritmos sort, binarySearch, reverse, shuffle, fill y copy operan con objetos List.

Algoritmo sort

Este algoritmos ordena los elementos de un objeto List, el cual debe implementar la interfaz Comparable. La llamada a sort puede también especificar como segundo argumento un objeto Comparator, para determinar una ordenación alterna de los elementos.

Ordenación normal

import java.util.List;
import java.util.Arrays;
import java.util.Collections;

public class Ordenacion1 {
    private static final String palos[] = {"Oros", "Copas", "Espadas", "Cannes"};
    
    public void imprimirElementos() {
        List<String> lista = Arrays.asList(palos);
        System.out.printf("Elementos de la tabla desordenados: \n%s \n", lista);
        Collections.sort(lista);
        System.out.printf("Elementos de la mesa ordenados: \n%s \n", lista);
    }

    public static void main(String args[]) {
        Ordenacion1 orden1 = new Ordenacion1();
        orden1.imprimirElementos();
    }
}

Ordenación inversa

import java.util.List;
import java.util.Arrays;
import java.util.Collections;

public class Ordenacion2 {
    private static final String palos[] = {"Oros", "Copas", "Espadas", "Cannes"};

    public void imprimirElementos() {
        List<String> lista = Arrays.asList(palos);
        System.out.printf("Elementos de la tabla desordenados: \n%s \n", lista);
        Collections.sort(lista, Collections.reverseOrder());
        System.out.printf("Elementos de la mesa ordenados: \n%s \n", lista);
    }
  
    public static void main(String args[]) {
        Ordenacion2 orden2 = new Ordenacio2();
        orden2.imprimirElementos();
    }
}

Ordenación mediante un objeto Comparator

En el programa siguiente se crea una clase Comparator personalizada para comparar dos objetos Tiempo. Esta clase declarada en el código siguiente representa tiempo en horas, minutos y segundos.

public class Tiempo {
    private int hora;
    private int minuto;
    private int segundo;

    public Tiempo() {
        this(0, 0, 0);
    }

    public Tiempo(int h) {
        this(h, 0, 0);
    }

    public Tiempo(int h, int m) {
        this(h, m, 0);
    }

    public Tiempo(int h, int m, int s) {
        establecerTiempo(h, m, s);
    }

    public Tiempo(Tiempo tiempo) {
        this(tiempo.obtenerHora(), tiempo.obtenerMinuto(), tiempo.obtenerSegundo());
    }

    public void establecerTiempos(int h, int m, int s) {
        establecerHora(h);
        establecerMinuto(m);
        establecerSegundo(s);
    }

    public void establecerHora(int h) {
        hora = ((h >= 0 && h < 24) ? h: 0);
    }
    
    public void establecerMinuto(int m) {
        minuto = ((m >= 0 && m < 60) ? m: 0);
    }

    public void establecerSegundo(int s) {
        segundo = ((s >= 0 && s < 60) ? s: 0);
    }

    public int obtenerHora() {
        return hora;
    }

    public int obtenerMinuto() {
        return minuto;
    }

    public int obtenerSegundo() {
        return segundo;
    }

    public String aStringUniversal() {
        return String.format ("%02d:%02d:%02d", obtenerHora(), obtenerMinuto(), obtenerSegundo());
    }

    public String toString() {
        return String.format("%d:%02d:%02d %s", ((obtenerHora() == 0 || obtenerHora() == 12) ? 12 : obtenerHora() % 12), obtenerMinuto(), obtenerSegundo(), (obtenerHora() < 12 ? "AM" : "PM"));
    }
}

La clase ComparadorTiempos implementa la interfaz Comparator, un tipo genérico que recibe un argumento (en este caso Tiempo). El método compare realiza comparaciones entre dos objetos Tiempo.

import java.util.Comparator;

public class ComparadorTiempos implements Comparator<Tiempo> {

    public int compare(Tiempo tiempo1, Tiempo tiempo2) {
        int compararHora = tiempos1.obtenerHora() - tiempos2.obtenerHora();
        if (compararHora != 0) return compararHora;
        int compararMinut = tiempos1.obtenerMinuto() - tiempos2.obtenerMinuto();
        if (compararMinuto != 0) return comparaMinut;
        int compararSegundo = tiempos1.obtenerSegundo() - tiempos2.obtenerSegundo();
        return compararSegon;
    }
}

El programa siguiente ordena una lista mediante el uso de la clase ComparadorTiempos, utilizando el método sort.

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class Ordenacion3 {

    public void imprimirElementos() {
        List<Tiempo> lista = new ArrayList<Tiempo>();
        lista.add(new Tiempo(6, 24, 34));
        lista.add(new Tiempo (18, 14, 58));
        lista.add(new Tiempo (6, 05, 34));
        lista.add(new Tiempo (12, 14, 58));
        lista.add(new Tiempo (6, 24, 22));
        System.out.printf("Elementos de la lista desordenados: \n%s \n", lista);
        Collections.sort(lista, new ComparadorTiempos());
        System.out.printf("Elementos de la lista ordenados: \n%s \n", lista);
    }

    public static void main(String args[]) {
        Ordenacion3 ordenacion3 = new Ordenacion3();
        ordenacion3.imprimirElementos();
    }
}