"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-09
Parcourir:711

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 le résultat 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 l'ordre de tri correct, il est nécessaire d'extraire les éléments de PriorityQueue un par un. 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 :

while (!queue.isEmpty()) {
   System.out.println(queue.poll());
}

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

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3