2011-04-17 11 views
16

Tengo una Cola de prioridades en la que agrego un objeto Node, donde los Nodos deben ordenarse por un valor que contienen. Por alguna razón, la cola de prioridad no ordenará los Nodos en agregar. Si alguien puede ver algo mal con esto o tiene alguna guía, lo agradezco. He aquí un breve ejemplo:PriorityQueue no sorting on add

PriorityQueue<Node> PQ = new PriorityQueue<Node>(); 
     //for each entry create a node and add it to the PriorityQueue 
     for(Entry<Character,Integer> entry : entries){ 
      PQ.add(new Node(entry.getKey(),entry.getValue(), true)); 
     } 

aquí es compareTo método del nodo:

@Override 
public int compareTo(Node n) { 
    if(n.frequency.intValue() > this.frequency.intValue()) return -1; 
    else if(n.frequency.intValue() == this.frequency.intValue()) return 0; 
    else return 1; 
} 

Respuesta

34

supongo que esperas PriorityQueue para devolver los elementos en un orden particular cuando se iterar. Sin embargo, PriorityQueue no proporciona dicho comportamiento, ya que se implementa como un montón de prioridad en lugar de una lista ordenada. De javadoc:

El iterador dentro de iterador() método no está garantizada para atravesar los elementos de la cola de prioridad en cualquier orden particular. Si necesita un recorrido ordenado, considere usar Arrays.sort (pq.toArray()).

La única garantía proporcionada por PriorityQueue es que poll(), peek(), etc devolver el elemento menor. Si necesita una iteración ordenada de elementos, use otra colección como TreeSet.

+0

Correcto, pero espero que esté ordenado al eliminar cada objeto utilizando el método remove() –

+0

@Trevor: No ha mostrado el código de iteración. Actualice su pregunta para mostrar un espectáculo pero el ejemplo * completo *, que podemos compilar y ejecutar. –

+0

No importa, ahora me doy cuenta de que en remove() el objeto está ordenado. Gracias a todos –

Cuestiones relacionadas