En PC Resumen vamos a hablar de una clase y una interfaz bastante curiosas, estas son: PriorityQueue y la interfaz Queue.

Queue es una interfaz que extiende a Collection y proporciona operaciones para trabajar con una cola. PriorityQueue es una de las clases que implementa esta interfaz y ordena los elementos en base a su orden natural, según lo especificado por el método comparó los elementos Comparable, o mediante un objeto Comparator que se suministra a través del constructor. Esta clase proporciona una funcionalidad que permite inserciones en orden y eliminaciones de la parte frontal (desencolar normalmente). Al insertar se hace según una prioridad, de tal forma que el elemento de mayor prioridad se sitúa el primero. Las operaciones más habituales son offer para insertar en la posición adecuada según la prioridad, poll por desencolar, peek para obtener el primero de la cola, clear para eliminar todos los elementos de la cola y size para obtener el número de elementos de la cola .

En PC Resumen vamos a hablar de la clase Stack. La clase Stack extiende a la clase Vector para implementar una estructura de datos de tipo pila. Funciona como las pilas que conocéis y básicamente tiene los métodos push (apilar), pop (desapilar), peek (cima) y empty (esta vacia).

import java.util.Stack;
import java.util.EmptyStackException;

public class PruebaStack {
    
    public PruebaStack() {
        Stack<Number> pila = new Stack<Number>();
        Long numeroLong = 12L;
        Integer numeros = 34567;
        Float numeroFloat = 1.0F;
        Double numeroDouble = 1234.5678;
        pila.push(numeroLong);
        imprimirPila(pila);
        pila.push(numeros);
        imprimirPila(pila);
        pila.push(numeroFloat);
        imprimirPila(pila);
        pila.push(numeroDouble);
        imprimirPila(pila);
        try {
            Number objetoEliminado = null;
            while(true) {
                objetoEliminado = pila.pop();
                System.out.printf("%s se quita \n", objetoEliminado);
                imprimirPila(pila);
            }
        } Catch(EmptyStackException emptyStackException) {
            emptyStackException.printStackTrace ();
        }
    }

    private void imprimirPila(Stack<Number> pila) {
        if (pila.empty()) {
            System.out.print("la pila esta vacia\n\n");
        } else {
            System.out.print("la pila contiene: ");
            for (Number numero : pila) {
                System.out.printf("%s ", numero);
            }
            System.out.print("(superior) \n\n");
        }
    }

    public static void main(String args[]) {
        new PruebaStack();
    }
}

Como la esta clase extiende a Vector podemos utilizar cualquiera de los métodos de esta clase como por ejemplo add para añadir a cualquier posición, pero entonces no estaríamos operando con una pila. Por lo tanto con pilas sólo hay que utilizar apilar y desapilar.

En PC Resumen vamos a hablar de los algoritmos binarySearch, addAll, frequency y disjoint en Java.

Algoritmo binarySearch

Este algoritmo es un método estático de la clase Collections. El algoritmo realiza la búsqueda en un objeto List. Funciona igual que lo que vimos en el artículo La clase Array en Java, pero también tiene una versión sobrecargada que recibe un objeto Comparator como tercer argumento, el cual especifica cómo se deben comparar los elementos.

Algoritmos addAll, frequency y disjoint

El algoritmo addAll recibe dos argumentos: un objeto Collection en el que se insertarán los elementos y una tabla que proporciona los elementos a insertar. El algoritmo frequency recibe dos argumentos: un objeto Collection donde buscar y un Object que se debe buscar. Este método devuelve el número de veces que aparece este objeto en la colección. El algoritmo disjoint recibe dos objetos Collection y devuelve cierto si no tienen ningún elemento en común.

En el programa siguiente muestra la utilización de estos tres métodos:

En PC Resumen hablaremos de los algoritmos reverse, fill, copy, max, min en Java. El algoritmo reverse invierte el orden de los elementos en un objeto List y el algoritmo fill sobrescribe los elementos con un valor especificado. El algoritmo copy recibe dos argumentos List, el origen y el destino y hace una copia. Si el objeto destino es más largo, los elementos que no se sobrescriban quedarán sin cambios.

Todos los algoritmos que hemos visto hasta ahora trabajan con objetos List. Los algoritmos min y max operan en cualquier objeto Collection y devuelven respectivamente el elemento más pequeño y el más grande. Ambos algoritmos pueden llamarse con un objeto Comparator como segundo argumento para realizar comparaciones personalizadas.

En PC Resumen vamos a hablar del algoritmo Shuffle y os vamos a enseñar como funciona. Este algoritmo ordena al azar los elementos de un objeto List. En el programa siguiente utilizaremos este algoritmo para remover una baraja de objetos Carta.

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

class Carta {
    public static enum Cara {As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Bajo, Caballo, Rey};
    public static enum Pal {Cannes, Oros, Copas, Espadas};
    private final Cara cara;
    private final Palo palo;
    
    public Carta(Cara caraCarta, Palo paloCarta) {
        cara = caraCarta;
        palo = paloCarta;
    }

    public Cara obtenerCara() {
        return cara;
    }

    public Pal obtenerPalo() {
        return palo;
    }

    public String toString () {
        return String.format ("%s %s", cara, palo);
    }
}

public class BarajaDeCartas {
    private List<Carta> lista;
   
    public BarajaDeCartas() {
        Carta[] baraja = new Carta[48];
        int cuenta = 0; // número de cartas
        for (Carta.Pal palo: Carta.Pal.values()) {
            for (Carta.Cara cara: Carta.Cara.values()) {
                baraja[cuenta] = new Carta(cara, palo);
                cuenta ++;
            }
        }
        lista = Arrays.asList(baraja);
        Collections.shuffle(lista); // baraja
    }

    public void imprimirCartas() {
        // muestra las cartas en dos columnas
        for (int i = 0; i < llista.size(); i ++) {
            System.out.printf("% - 20s %s", lista.get(i), ((i + 1) % 2 == 0) ? "\n" : "");
        }
    }

    public static void main(String args[]) {
        BarajaDeCartas cartas = new BarajaDeCartas();
        cartas.imprimirCartas();
    }
}