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:
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=newPriorityQueue();...// preencher a priority queueString[]elementos=pq.toArray();Arrays.sort(elementos);
J
javando
Vini, o que vc me passou é equivalente ao iterator… portanto nao retorna uma ordem determinada…
Thingol, ridiculo issu né veio … será que só tem essa forma mesmo?
obrigado pelas respostas
T
thingol
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).
V
victorwss
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?
R
rmala_ti
Nossa, nem cheguei a essa parte do livro mas já fiquei confuso.
T
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.
V
victorwss
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.
Traduzindo: Uma fila ordenada. Ou não?
T
thingol
É só isso. Mas ela é implementada internamente como um “heap” - veja seus livros de estruturas de dados para ver o que é isso; não é o “heap” da JVM.
V
victorwss
Beleza. Se ela fosse chamada SortedQueue seria muito mais fácil entender o que faz.
T
thingol
Beleza. Se ela fosse chamada SortedQueue seria muito mais fácil entender o que faz.
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.
T
thingol
Quanto a nomes ruins de classes, acho que nada bate no JDK a classe java.io.File.
Todo mundo aqui já fez (ou vai fazer) a besteira de tentar trabalhar com arquivos usando só java.io.File.
Ela deveria se chamar “FileInfo”, “FileMetaData” ou coisa parecida, como no .NET.
G
gustavobs
voce pode usar o
método isEmpty() para verificar se há itens ainda na queue…
mas dessa forma ai em cima … os itens serão removidos , coisa que eu não quero XXD
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 ?
G
gustavobs
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.
J
Jeferson_Manetti
bom ja q o amigo quer algo q possar ser classificado e tenha comportamento de fila…
pq não usar LinkedList… implementa List e Queue
packagepct01;importjava.util.Collections;importjava.util.LinkedList;publicclassLl{publicstaticvoidmain(String[]args){LinkedList<Integer>ll=newLinkedList<Integer>();ll.add(4);ll.add(1);ll.add(3);ll.add(2);// saida 1for(Integers:ll){System.out.println(s);}// saida 2 for(inti=0;i<4;i++){// isso remove dai num aparece nd la embaixo... rss// mais aqui ele se comporta como fila =)// first-in first-out//System.out.println(ll.poll());}Collections.sort(ll);// saida 3for(Integers:ll){System.out.println(s);}}}