Maison > Java > javaDidacticiel > Pourquoi PriorityQueue.toString() ne reflète-t-il pas avec précision l'ordre des éléments dans une PriorityQueue ?

Pourquoi PriorityQueue.toString() ne reflète-t-il pas avec précision l'ordre des éléments dans une PriorityQueue ?

Patricia Arquette
Libérer: 2024-10-31 05:25:02
original
331 Les gens l'ont consulté

Why does PriorityQueue.toString() not accurately reflect the order of items in a PriorityQueue?

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>
Copier après la connexion

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]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal