PriorityQueue e Queue

3 respostas
rafaelolian

Pessoal,

Eu já dei uma procurada mais ainda não ficou claro a aplicação da interface Queue

eu estava brincando com ela aqui e não entendi ainda sua diferença para a famosa List
e também não entendi direito os métodos offer, peek, poll

quanto eu preciso dessa interface e desses métodos???

issu caiu num cimulado scjp de java 5 e eu nunca ouvi falar dela

valeww…

3 Respostas

T

PriorityQueue é uma lista que fica com seus elementos ordenados, e pode ter elementos repetidos; nesse ponto é diferente de um SortedSet.

Ela existe, por exemplo, para você poder implementar filas de prioridade - por exemplo, se a prioridade do Lula é 1 e a prioridade de você, pobre mortal, é 10, então ele fica na sua frente na fila, mesmo tendo chegado depois.

Alkamavo

Que comparação mais maluca…
hahahahaha

Lula e pobre mortal…

T
import java.util.*;

class Par < T extends Comparable < T > , U >  implements Comparable < Par < T,U > >  {
    private T t;
    private U u;
    public Par (T t, U u) { this.t = t; this.u = u; }
    public T getT() { return t; }
    public U getU() { return u; }
    public int compareTo (Par < T,U >  obj) {
        return t.compareTo (obj.getT());
    }
    public String toString() { return "{" + t + "," + u + "}"; }
}

class Pessoa {
    private String nome;
    public Pessoa (String nome) { this.nome = nome; }
    public String toString() { return nome; }
}

class ExemploPriorityQueue {
    public static void main(String[] args) {
        PriorityQueue  < Par < Integer,Pessoa > >  pq = new PriorityQueue  < Par < Integer,Pessoa > > ();
        // A diferença entre "add" e "offer" é que add lança uma exceção se a fila estiver cheia,
        // e offer náo lança a tal exceção, mas isso é só para outras classes que implementam Queue.
        // Para PriorityQueue não há diferença alguma.
        pq.add (new Par < Integer,Pessoa > (10, new Pessoa ("Gabriel O Pensador")));
        pq.offer (new Par < Integer,Pessoa > (3, new Pessoa ("Gilberto Kassab")));
        pq.add (new Par < Integer,Pessoa > (2, new Pessoa ("Jose Serra")));
        pq.add (new Par < Integer,Pessoa > (3, new Pessoa ("Cesar Maia")));
        pq.add (new Par < Integer,Pessoa > (2, new Pessoa ("Sergio Cabral")));
        pq.add (new Par < Integer,Pessoa > (1, new Pessoa ("Luis Inacio Lula da Silva")));
        
        // Iterando sobre a priority queue - note que a ordem é indefinida; 
        // 
        for (Par < Integer, Pessoa >  p : pq) {
            System.out.println (p);
        }
        // Copiando a priority queue só para fazer uma demonstração.
        PriorityQueue < Par < Integer,Pessoa > >  pqCopia = new PriorityQueue < Par < Integer,Pessoa > > ();
        pqCopia.addAll (pq);
        // Imprimindo a priority queue na ordem de prioridade. 
        // Note que a ordem de dois elementos com a mesma
        // prioridade é indefinida. Infelizmente, imprimir uma priority queue a destrói, 
        // porque temos de usar "poll", que remove sempre o primeiro elemento da fila.
        System.out.println ("-------------");
        for (Par < Integer,Pessoa >  p = pq.poll(); p != null; p = pq.poll()) {
            System.out.println (p);
        }
        // Imprimindo a priority queue, mas usando peek e remove.
        System.out.println ("-------------");
        for (Par < Integer,Pessoa >  p = pqCopia.peek(); p != null; ) {
            System.out.println (p);
            pqCopia.remove (p);
            p = pqCopia.peek();
        }
        // Mostrando que "element" lança uma exceção se a priority queue estiver vazia.
        // "element" é semelhant a "peek", exceto por esse fato.
        try {
            Par < Integer, Pessoa >  p = pq.element();
        } catch (NoSuchElementException ex) {
            ex.printStackTrace();
        }
        
    }
}
Criado 23 de fevereiro de 2008
Ultima resposta 23 de fev. de 2008
Respostas 3
Participantes 3