"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que o método PriorityQueue `toString` do Java não reflete a ordem dos elementos definida pelo Comparador?

Por que o método PriorityQueue `toString` do Java não reflete a ordem dos elementos definida pelo Comparador?

Publicado em 2024-11-09
Navegar:319

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

Como o método toString de PriorityQueue engana a interpretação da ordem dos elementos

Em Java, a estrutura de dados PriorityQueue mantém um heap binário para priorizar elementos com base em seus atribuídos estratégia de comparação. Essa estratégia normalmente é implementada por meio de um Comparador customizado, conforme visto no trecho de código fornecido. No entanto, há um equívoco comum em relação à ordem dos elementos ao examinar a saída do método toString de um PriorityQueue.

O método toString foi projetado para fornecer uma representação textual do conteúdo do PriorityQueue. No entanto, não impõe implicitamente a ordem de prioridade definida pelo Comparador. Em vez disso, ele simplesmente exibe os elementos em suas posições atuais dentro do heap, o que pode não se alinhar com a ordem de classificação esperada.

No exemplo dado, o PriorityQueue é inicializado com um Comparator personalizado para priorizar os valores de frequência. Você pretendia que a saída refletisse essa ordem, com os elementos com frequências mais baixas listados primeiro. No entanto, a saída do método toString mostra uma ordem incorreta, aparentemente contradizendo a prioridade pretendida.

A causa dessa discrepância decorre da estrutura interna de um heap binário. Embora mantenha uma ordem parcial, os elementos não são totalmente classificados até que sejam removidos do heap. O método toString recupera os elementos diretamente do heap sem realizar essa classificação, levando à saída observada.

Para resolver esse problema e obter a ordem de classificação correta, é necessário extrair os elementos do PriorityQueue um por um. O método poll() faz isso, removendo um elemento do heap e retornando-o. Ao iterar por PriorityQueue usando poll() e imprimir os elementos retornados, você pode obter a ordem de classificação conforme pretendido.

Portanto, o código correto para imprimir os elementos na ordem de classificação seria:

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

Isso imprimirá os elementos em ordem crescente de suas frequências, conforme definido pelo Comparador.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3