Maison > Java > javaDidacticiel > Pourquoi la méthode PriorityQueue `toString` de Java ne reflète-t-elle pas l'ordre des éléments défini par le comparateur ?

Pourquoi la méthode PriorityQueue `toString` de Java ne reflète-t-elle pas l'ordre des éléments défini par le comparateur ?

DDD
Libérer: 2024-11-04 05:04:29
original
1023 Les gens l'ont consulté

Why does Java's PriorityQueue `toString` method not reflect the element order defined by the Comparator?

Comment la méthode toString de PriorityQueue induit en erreur l'interprétation de l'ordre des éléments

En Java, la structure de données PriorityQueue maintient un tas binaire pour hiérarchiser les éléments en fonction de leur attribution. stratégie de comparaison. Cette stratégie est généralement mise en œuvre via un comparateur personnalisé, comme le montre l'extrait de code fourni. Cependant, il existe une idée fausse courante concernant l'ordre des éléments lors de l'examen du résultat de la méthode toString d'une PriorityQueue.

La méthode toString est conçue pour fournir une représentation textuelle du contenu de PriorityQueue. Cependant, il n'applique pas implicitement l'ordre de priorité défini par le comparateur. Au lieu de cela, il affiche simplement les éléments dans leurs positions actuelles dans le tas, ce qui peut ne pas correspondre à l'ordre de tri attendu.

Dans l'exemple donné, PriorityQueue est initialisé avec un comparateur personnalisé pour hiérarchiser les valeurs de fréquence. Vous vouliez que la sortie reflète cet ordre, les éléments ayant des fréquences plus basses étant répertoriés en premier. Cependant, le résultat de la méthode toString affiche un ordre incorrect, apparemment en contradiction avec la priorité prévue.

La cause de cette divergence provient de la structure interne d'un tas binaire. Bien qu'il conserve un ordre partiel, les éléments ne sont pas entièrement triés tant qu'ils ne sont pas supprimés du tas. La méthode toString récupère les éléments directement du tas sans effectuer ce tri, conduisant au résultat observé.

Pour résoudre ce problème et obtenir le bon ordre de tri, il est nécessaire d'extraire les éléments de PriorityQueue un par un. La méthode poll() fait cela, en supprimant un élément du tas et en le renvoyant. En parcourant PriorityQueue à l'aide de poll() et en imprimant les éléments renvoyés, vous pouvez obtenir l'ordre de tri comme prévu.

Par conséquent, le code correct pour imprimer les éléments dans l'ordre trié serait :

<code class="java">while (!queue.isEmpty()) {
   System.out.println(queue.poll());
}</code>
Copier après la connexion

Cela imprimera les éléments par ordre croissant de leurs fréquences, telles que définies par le comparateur.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal