eu tava tentando iterar em um priorityQueue, mas o único jeito que eu encontrei de iterar foi usando o poll e verificando se a quantidade de itens não era zero:
[code] while(pq.size() > 0){
System.out.println(pq.poll());
}[/code]
mas dessa forma ai em cima … os itens serão removidos , coisa que eu não quero XXD
eu tentei usar o peek()
[code] while(pq.size() > 0){
System.out.println(pq.peek());
}[/code]
mas ele roda o while infinitamente, retornando o mesmo elemento loucamente rs
tentei usar o iterator, mas ele não retorna um conjunto ordenado, vem em uma ordem nada a ver.
O iterador de um PriorityQueue realmente não retorna os itens na ordem desejada (menor elemento primeiro); conforme você mesmo disse, só dá para obter nessa ordem usando “poll”.
De fato, para obter os elementos em ordem crescente, conforme a documentação da classe java.util.PriorityQueue, faça isto aqui:
PriorityQueue <String> pq = new PriorityQueue();
... // preencher a priority queue
String[] elementos = pq.toArray();
Arrays.sort (elementos);
Olhei o fonte de java.util.PriorityQueue para poder lhe afirmar o que lhe disse.
O iterator retornado pelo java.util.PriorityQueue é um membro de uma classe interna, chamada Itr, que tem esse comportamento esquisito (mas que é o melhor possível dentro das devidas limitações).
Se olhar no fonte, vai ver que ele sugere exatamente essa forma (copiar e ordenar o array).
Isso é uma coisa que eu ainda não entendi em java e que cai na prova de certificação.
Afinal qual é o comportamento da PriorityQueue? E para que ela serve no fim das contas?
Uma PriorityQueue é uma fila que fica sempre ordenada pelo valor do elemento inserido*. Você pode ter elementos com valores repetidos (nisso ela é diferente de um TreeSet, por exemplo), e você pode ou pegar o primeiro elemento (peek) ou então removê-lo (poll).
Há uma variação (PriorityBlockingQueue) que bloqueia ao tentar pegar o primeiro elemento, se a fila estiver vazia (take).
Seria “mais ou menos” como se fosse uma fila de atendimento onde os mais novos é que fossem passados para a frente dos mais velhos.
[quote=thingol]Uma PriorityQueue é uma fila que fica sempre ordenada pelo valor do elemento inserido*. Você pode ter elementos com valores repetidos (nisso ela é diferente de um TreeSet, por exemplo), e você pode ou pegar o primeiro elemento (peek) ou então removê-lo (poll).
Há uma variação (PriorityBlockingQueue) que bloqueia ao tentar pegar o primeiro elemento, se a fila estiver vazia (take).
Seria “mais ou menos” como se fosse uma fila de atendimento onde os mais novos é que fossem passados para a frente dos mais velhos. [/quote]
Beleza. Se ela fosse chamada SortedQueue seria muito mais fácil entender o que faz.[/quote]
SortedQueue é “como ela é implementada”. PriorityQueue é “para que ela serve”.
Usualmente você tenta descrever as coisas em termos de “para que servem” em vez do que “como são implementadas”.
Algumas coisas são nomeadas “como são implementadas” - um ArrayList é um List, implementado internamente como um Array. Outras têm uma mistura de “como se comportam” e “para que servem”. Um exemplo é a BlockingPriorityQueue - ela é uma PriorityQueue que bloqueia o chamador, se a fila estiver vazia.
mas dessa forma ai em cima … os itens serão removidos , coisa que eu não quero XXD
[/quote]
Já que não quer que sejam removidos, será que o que você precisa realmente é de uma fila?
Acho que esse negócio de “pegou-removeu” faz parte da natureza das Queues, pra isso elas servem… Quem sabe um Set ordenado não seja a melhor opção ?
Eu penso que ela armazene os elementos de maneira aleatória(para nos) e ela é sorted apenas quando se usa os métodos pool() e peek()…
a implementação destes metodos fariam a classificação… creio que seja isto.