Collections

17 respostas
G

Ola pessoal, gostaria de saber o que que acontece neste caso de collections?
eu fiz a simulacao e no meu deu 2243, mas na verdade o resultado eh 2234… porque? PrirityQueue nao eh ordenado… ou eh?

import java.util.*;

public class Test2{

	public static void main(String[] args){
	PriorityQueue<String> pq = new PriorityQueue<String>();
	pq.add("2");
	pq.add("4");
	System.out.print(pq.peek() + " ");
	pq.offer("1");
	pq.add("3");
	pq.remove("1");
	System.out.print(pq.poll() + " ");
	if(pq.remove("2")) System.out.print(pq.poll() + " ");
	System.out.print(pq.poll() + " " +pq.peek());
	}
	
}

17 Respostas

programadora

PriorityQueue é ordenado por prioridade, nesse caso a prioridade é do menor para o maior número.

taaqui

Acho que descobrir debugando, veja so.

import java.util.*;  
   
 public class Test2{  
   
     public static void main(String[] args){  
     PriorityQueue<String> pq = new PriorityQueue<String>();  
     pq.add("2");  //[2]
     pq.add("4");  //[2, 4]
     System.out.print(pq.peek() + " "); // imprimir 2 que é o primeiro argumento mais não deleta,  [2, 4]
     pq.offer("1");  //[1, 4, 2]
     pq.add("3");  // aqui não sei porq diabos ele começa a ordenar assim, pelo que vimos ontem, [1, 3, 2, 4]
     pq.remove("1");  //remove o 1, aqui começa o erro da nossa resposta que no nosso ponto de vista seria pela entrada na pilha, [3, 4, 2] mais o certo é [2, 3, 4]
     System.out.print(pq.poll() + " ");  // imprimir 2 que é o primeiro, mais agora ele deleta. Na nossa lógica ele seria o segundo, certo, então imprimiríamos e deletariamos o 3? Segundo o compilador fica assim [3, 4]
     if(pq.remove("2")) System.out.print(pq.poll() + " ");  // Não entra no if
     System.out.print(pq.poll() + " " +pq.peek());  // imprimir o primeiro item de lista que é o 3 e deleta, depois imprimir o segundo item 4 deixa ele la boladão, então imprimiria até agora,[2, 2, 3, 4], mais na nossa logica seria ao contrario, porq não sabemos como que diabos o Queue ordenou na linha [2, 3, 4].
     }  
       
 }
Djonatah

PrintQueue que eh uma Ordered Collection. Ele usa “natural order of elements” - ou seja - os elementos precisam implementar a interface Comparable.

Tente adicionar elementos criados por voce, e que nao implementem a interface Comparable.
Abracos

<><

G

PrintQueue que eh uma Ordered Collection. Ele usa “natural order of elements” - ou seja - os elementos precisam implementar a interface Comparable.

Tente adicionar elementos criados por voce, e que nao implementem a interface Comparable.
Abracos

<><

legal… se ele eh ordenado pelas ordem natual dos elementos porque entao eh imprimido [1, 3, 2, 4] na linha que o taaqui falou???

G

Alguem por favor sabe me explicar qual eh a ordem desse PriorityQueue, eu sei que eh por ordem natural dos objetos, mas eu acabei de fazer um teste pra ver se vai na ordem alfabetica:

import java.util.*;

 public class PQ {
 public static void main(String[] args) {
 PriorityQueue&lt;String&gt; pq = new PriorityQueue&lt;String&gt;();
 pq.add("d");
 pq.add("b");
 pq.add("a");
 pq.add("c");
 pq.add("e");
 System.out.println(pq);
 System.out.println(pq.poll() +":" + pq.peek());
 }
 }

imprime: [a, c, b, d, e]

gustavobs

cara to com a mesma duvida que voce!!

maldita priority queue nao consigo entende esse ordenamento fdp!!

hehehe acabei de errar uma questao aqui por isto…

Na API diz

“This queue orders elements according to an order specified at construction time, which is specified either according to their natural order”

Mas algo estranho acontece que nao ordena normalmente…

gustavobs

Bom descobri o seguinte…

pelo loop ele realmente retorna uma sequencia estranha… mas utilizando os metodos da classe como pool() e peek() ele retorna os valores na ordem natural correta, portanto deve ser alguma forma de armazenamento da jvm que sabemos…

G

gustavobs:
cara to com a mesma duvida que voce!!

maldita priority queue nao consigo entende esse ordenamento fdp!!

hehehe acabei de errar uma questao aqui por isto…

Na API diz

“This queue orders elements according to an order specified at construction time, which is specified either according to their natural order”

Mas algo estranho acontece que nao ordena normalmente…

hahaha eh cara… eu to sofrendo nessa maldita collection… ja errei 3 questoes dos mocks que eu estava fazendo por causa disso… :?

G

gustavobs:
Bom descobri o seguinte…

pelo loop ele realmente retorna uma sequencia estranha… mas utilizando os metodos da classe como pool() e peek() ele retorna os valores na ordem natural correta, portanto deve ser alguma forma de armazenamento da jvm que sabemos…

entao cara eu tambem vi aqui que ele eh ordenado por ordem natural e tambem por ordem de insercao. mas nao sei como que isso funciona.

Djonatah

Ordered não é a mesma coisa que sorted.

Então quando você usa o método toString() ou o enhanced for loop, ele não vai mesmo trazer os elementos da maneira ordenada.

mas se você usar métodos de interação como poll() e remove(), então ele trará os elementos de forma ordenada (e também removendo da coleção)

for(;pq.size() > 0;){
System.out.print(pq.poll());
}

Tente colocar esse trecho a iteração entre a coleção vai ser de maneira ordenada.

Espero ter ajudado e não consundido.
Abraços
<><

G

Djonatah:
Ordered não é a mesma coisa que sorted.

Então quando você usa o método toString() ou o enhanced for loop, ele não vai mesmo trazer os elementos da maneira ordenada.

mas se você usar métodos de interação como poll() e remove(), então ele trará os elementos de forma ordenada (e também removendo da coleção)

for(;pq.size() > 0;){
System.out.print(pq.poll());
}

Tente colocar esse trecho a iteração entre a coleção vai ser de maneira ordenada.

Espero ter ajudado e não consundido.
Abraços
<><

Cara, foi mal mas eu me confundi mais… nao to sacando qual eh que eh a ordencao dessa priorityQueue

taaqui

Então ele ordena quando retiramos ou removemos de maneira Natural, e depois ele ordena denovo como na forma de inserção?

Djonatah

Ordenado nao tem nenhuma relacao com a maneira de como os elementos ficarao guardados na Collection (ou seja, eles nao ira ser armazenados ordenadamente, mas sim obtidos ordenadamente).

Por exemplo se voce adiciona a,c,b nao necessariamente a PriorityQueue ira retornar o metodo toString() desta maneira [a,b,c]. Isso
porque a Collection eh ordered e nao sorted.

Mas se voce iterar atraves da collection com os metodos remove() ou poll(), ai entra a questao da collection ser ordered.

Por exemplo: ArrayList eh ordered by index. Se eu iterar usando o metodo get(i) vou ir pegando os elementos do elemento 0 ateh o zise() de maneira ordenada (por indice).
PrintQueue eh ordered by natural order (ou Comparator). Se eu iterar com poll() e remove() eu vou pegar desde o primeiro elemento (qual eh? nao eh o primeiro que foi inserido) ateh size() de maneira ordenada (por comparacao).

Bottom line - se voce iterar com enhanced for loop (ou “dar” um toString() na collection), os elementos nao sairao de maneira ordenada. Se voce iterar com remove() e poll() sim.

Ele nao ordenada , mas ele retira de maneira ordenada o que eh diferente - e e sobre a insercao, bom ela nao tera nenhuma importancia, desde que a “retirada” de elementos eh que sera de maneira ordenada

G

Cara valeu mesmo, entendi certinho como que funciona em relacao aos metodos poll(), peek() e que a priorityQueue nao eh ordenada mas sim quando seus elementos forem "pegos", serao "pegos" de uma forma ordenada natural, mas isso nao fara com mudanca nenhuma nos elementos da collections (somente se invocarmos o poll() que retornara e removera o elemento), estou certo?

Agora uma unica coisa que eu nao entendi eh isso o que voce falou:


Bottom line - se voce iterar com enhanced for loop (ou "dar" um toString() na collection), os elementos nao sairao de maneira ordenada. Se voce iterar com remove() e poll() sim.

Entao se eu iterar a collection em um enhanced for ou pelo metodo toString() nao ha uma ordem determinada? pois no exemplo abaixo o toString() retorna os elementos em uma ordem que nao consigo pensar qual possa ser.

import java.util.*;

public class PQ {  
public static void main(String[] args) {  
PriorityQueue&lt;String&gt; pq = new PriorityQueue&lt;String&gt;();  
pq.add("d");  
pq.add("b");  
pq.add("a");  
pq.add("c");  
pq.add("e");  
System.out.println(pq);  //a, c, b, d, e
System.out.println(pq.poll() +":" + pq.peek());  
System.out.println(pq); // b, c, e, d
}  
}
Djonatah

gumatias:
Cara valeu mesmo, entendi certinho como que funciona em relacao aos metodos poll(), peek() e que a priorityQueue nao eh ordenada mas sim quando seus elementos forem "pegos", serao "pegos" de uma forma ordenada natural, mas isso nao fara com mudanca nenhuma nos elementos da collections (somente se invocarmos o poll() que retornara e removera o elemento), estou certo?

Certo.

Sim, eles não sairão da maneira correta. Se você olhar a documentação da PriorityQueue, ela nem sobreescreve o método toString().
O enhanced for loop não posso dizer com extidão porque não funciona da maneira correta…

Abraços e ótimo final de semana.
<><

robson.rodrigues

gumatias, estive lendo na api sobre a classe PriorityQueue e olha só o que achei:

The Iterator provided in method iterator() is not guaranteed to traverse the elements of the PriorityQueue in any particular order.
If you need ordered traversal, consider using Arrays.sort(pq.toArray()).

Logo, para resolver o problema da ordenação use o que Djonatah postou

Tudo isso por que fiquei com duvida nesse codigo que achei do JavaRanch, que com o comparable ou não ele só mostra
[1, 3, 6, 8, 4, 7]

import java.util.*;

class QueueTest
{
public static void main(String[] args)
{
Comparator<Integer> cp = new Comparator<Integer>()
{
public int compare(Integer int1,Integer int2)
{
return int1.compareTo(int2);
}
};
//Queue<Integer> q = new PriorityQueue<Integer>();
Queue<Integer> q = new PriorityQueue<Integer>(5,cp);

q.add(1);
q.add(3);
q.add(7);
q.add(8);
q.add(4);
q.add(6);
 
System.out.println(q);
}
}

E só mais uma coisa o método herdado é da classe AbstractCollection.

Abraço a todos.

G

Valeu cara… saquei qual que eh. :thumbup:

Criado 28 de janeiro de 2009
Ultima resposta 31 de jan. de 2009
Respostas 17
Participantes 6