Anomalie de classement PriorityQueue.toString() : expliquée
Lorsque vous essayez de récupérer des éléments d'une PriorityQueue, vous pouvez rencontrer un comportement inattendu où la sortie l'ordre ne correspond pas à la priorité attendue. En effet, PriorityQueue.toString() fournit uniquement un instantané de l'état interne de la file d'attente, qui peut ne pas représenter l'ordre de tri.
Pour résoudre ce problème, au lieu de vous fier à toString(), vous devez interroger éléments de la file d'attente un par un à l'aide de la méthode poll(). Voici pourquoi :
Structure de tas et classement des files d'attente
En interne, PriorityQueue utilise une structure de données de tas pour maintenir efficacement l'ordre de tri. Cependant, le tas n’est pas toujours entièrement trié. Au lieu de cela, il s'agit d'un arbre partiellement ordonné, dans lequel chaque nœud est comparé à son parent et à ses enfants.
Lorsque vous ajoutez ou supprimez des éléments de la file d'attente, le tas subit des ajustements pour conserver cet ordre partiel. Par conséquent, appeler toString() dans la file d'attente n'affichera qu'un instantané de l'état actuel, qui peut ne pas correspondre à l'ordre de priorité attendu.
Solution : Utiliser Poll()
Pour obtenir les éléments dans l'ordre trié, vous devez les interroger un par un en utilisant la méthode poll(). La méthode poll() opère sur le dessus du tas, supprimant le nœud racine tout en conservant l'ordre des nœuds restants.
Exemple de code
Pour illustrer cela, envisagez la modification suivante à votre code :
<code class="java">import java.util.Comparator; import java.util.PriorityQueue; public class TreeNodeHuffman { public static void main(String[] args) { HuffmanComparator compare = new HuffmanComparator(); // Create and initialize PriorityQueue PriorityQueue<TreeNodeHuffman> queue = new PriorityQueue<>(26, compare); // ... Add nodes to the queue // Poll and print items while (!queue.isEmpty()) { System.out.println(queue.poll()); } } }</code>
En utilisant la méthode poll(), vous pouvez désormais voir les éléments dans l'ordre trié au fur et à mesure qu'ils sont supprimés de la file d'attente :
[z, q, x, j, k, v, b, m, i, c, e, s, o, w, a, r, h, p, t, l, a]
Cela correspond à votre attente d'obtenir en premier les éléments avec la fréquence la plus basse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!