2013-09-04 3 views
3

Je suis en train d'utiliser un PriorityQueue et je suppose que les éléments sont ajoutés dans le « ordre naturel » ..Java ordre naturel

imprimer les Quand je éléments ne est pas dans order..I triés s'attendraient le résultat - 1,2,3,4

package scratch; 
import java.util.*; 

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

} 

sortie:

2 [1, 3, 2, 4]

+5

'Cette classe et son iterator mettre en œuvre toutes les méthodes optionnelles des interfaces Collection et Iterator. L'Iterator fourni dans la méthode iterator() n'est pas garanti pour traverser les éléments de la file d'attente prioritaire dans un ordre particulier. Si vous avez besoin d'une traversée ordonnée, pensez à utiliser Arrays.sort (pq.toArray()).' – nachokk

+2

Copie possible de [L'itérateur intégré pour PriorityQueue de java ne traverse pas la structure de données dans un ordre particulier. Pourquoi?] (Http://stackoverflow.com/questions/2277430/the-built-in-iterator-for-javas-priorityqueue-does-not-traverse-the-data-struct) – Raedwald

Répondre

3

En Java, PriorityQueue ne garantit que la suppression (obtenir) les éléments sont en particulier. La consultation des éléments internes à l'aide de l'itérateur peut être de n'importe quel ordre.

L'Iterator fourni dans la méthode iterator() ne garantit pas de parcourir les éléments de la file d'attente prioritaire dans un ordre particulier. Si vous avez besoin d'une traversée ordonnée, pensez à utiliser Arrays.sort (pq.toArray()).

Et PriorityQueue hérite méthode toString() de AbstractCollection, qui, comme indiqué dans le code source: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/AbstractCollection.java#AbstractCollection.toString%28%29 utilise l'itérateur pour construire les String

public String toString() { 
     Iterator<E> i = iterator(); 
     if (! i.hasNext()) 
      return "[]"; 

     StringBuilder sb = new StringBuilder(); 
     sb.append('['); 
     for (;;) { 
      E e = i.next(); 
      sb.append(e == this ? "(this Collection)" : e); 
      if (! i.hasNext()) 
       return sb.append(']').toString(); 
      sb.append(", "); 
     } 
    } 

Donc, pour obtenir des données dans l'ordre de tri que vous devez les retirer du conteneur (ou les trier avec une autre méthode):

while (!pq.isEmpty()) System.out.print(pq.poll()+" "); 

impressions

1 2 3 4 
4

La représentation de chaîne d'un PriorityQueue ne reflète pas un Tout sur l'ordre des éléments à l'intérieur, il est uniquement basé sur l'ordre d'itération de iterator() de la file d'attente (c'est ainsi que toString() est défini dans AbstractCollection, et PriorityQueue utilise également cette implémentation). De la documentation liée:

L'itérateur ne retourne pas les éléments dans un ordre particulier.

4

De PriorityQueue

La méthode itérateur prévu dans itérateur() ne sont pas garanties pour traverser les éléments de la file d'attente prioritaire dans un ordre particulier. Si vous avez besoin d'une traversée ordonnée, , utilisez Arrays.sort (pq.toArray()).

Et parce que vous utilisez toString() qui est défini dans AbstractCollection et que vous voyez utilisez iterator donc pour n'est pas garanti.

public String toString() { 
     Iterator<E> it = iterator(); 
     if (! it.hasNext()) 
      return "[]"; 

     StringBuilder sb = new StringBuilder(); 
     sb.append('['); 
     for (;;) { 
      E e = it.next(); 
      sb.append(e == this ? "(this Collection)" : e); 
      if (! it.hasNext()) 
       return sb.append(']').toString(); 
      sb.append(',').append(' '); 
     } 
    } 
+0

Mais cela n'explique pas pourquoi 'toString()' fonctionne comme il le fait. Après tout, l'OP n'utilise pas d'itérateur directement dans son code. – arshajii

+0

@arshajii maintenant: D – nachokk

Questions connexes