English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico de Java

ControledeProcessoJava

JavaArray

JavaOrientadaaObjetos(I)

JavaOrientadaaObjetos(II)

JavaOrientadaaObjetos(III)

Tratamento de Exceção do Java

JavaLista(List)

JavaFila(QUEUE)

ConjuntomapdoJava

ConjuntoSetdoJava

JavaEntradaSaída(I/O)

ReaderdoJava/Writer

OutrosTópicosdoJava

PriorityQueue do Java

Neste tutorial, vamos aprender comexemplosaclassePriorityQueuedoJavaCollectionFramework.

AclassePriorityQueuefornecefuncionalidadesdedatagramaheap.

ElaimplementaInterfaceQueue

Diferente da fila comum, os elementos da fila de prioridade são pesquisadosnaordemdeordenamento.

Suponhamosquequeremospesquisargruposdeformaordenadaascendente. Neste caso, a cabeça da fila de prioridadeéoelemento mais pequeno. Após a pesquisa deste elemento, o próximo elemento mais pequeno tornar-se-á a cabeça da fila.

ÉimportanteNotarqueosElementosdaFilaPrioritárianãopodemestaremordenados. Entretanto, os elementos são sempre pesquisadosnaordemdeordenamento.

CriarPriorityQueue

为了创建优先级队列,我们必须导入java.util.PriorityQueue包。导入程序包后,可以使用以下方法在Java中创建优先级队列。

PriorityQueue<Integer> numbers = new PriorityQueue<>();

Para criar uma fila de prioridade,我们必须 importar o pacote java.util.PriorityQueue. Após a importação do pacote, podemos usar os seguintes métodos para criar uma fila de prioridade no Java.

Aqui, criamos uma fila de prioridade sem parâmetros. Neste caso, a cabeça da fila de prioridade é o menor elemento da fila. Os elementos serão removidos da fila em ordem crescente.

Mas, podemos usar o Comparator para personalizar a ordem dos elementos. Vamos entender isso na parte posterior do tutorial.

Métodos da PriorityQueue

A classe PriorityQueue fornece a implementação de todos os métodos existentes na interface Queue.

  • Inserir elemento na PriorityQueue - add()

  • Inserir o elemento especificado na fila. Se a fila estiver cheia, será lançada uma exceção. - offer()

Por exemplo,

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //Criando uma fila de prioridade
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        //Inserir o elemento especificado na fila. Se a fila estiver cheia, retornará false.
        numbers.add(4);
        numbers.add(2);
        System.out.println("PriorityQueue: "} + numbers);}}
        //Usando o método add()
        Usando o método offer()1);
        numbers.offer( + numbers);}}
    }
}

Resultado da Saída

PriorityQueue: [2, 4]
System.out.println("PriorityQueue atualizada: "}1, 4, 2]

PriorityQueue atualizada: [4E aqui, criamos uma fila de prioridade chamada numbers. Já inserimos2inserir na fila.

Embora4foi inserido em2Antes, mas a cabeça da fila era2. Isso é porque a cabeça da fila de prioridade é o menor elemento da fila.

Depois de que1Agora, reordenamos a fila para que o menor elemento1Armazenar no início da fila.

Acessar elemento da PriorityQueue

Para acessar elementos da fila de prioridade, podemos usar o método peek(). Este método retorna a cabeça da fila. Por exemplo,

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        // Criar fila de prioridade
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: "} + numbers);}}
        //Usando o método peek()
        int number = numbers.peek();
        System.out.println("Acessar elemento: "} + number);
    }
}

Resultado da Saída

PriorityQueue: [1, 4, 2]
Acessar elemento: 1

Excluir elemento da PriorityQueue

  • remove() - Excluir o elemento especificado da fila

  • poll() - Retornar e excluir o início da fila

Por exemplo,

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        // Criando uma fila de prioridade
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: "} + numbers);}}
        //Usando o método remove()
        boolean result = numbers.remove(2);
        System.out.println("Elemento2Já foi excluído? "} + result);
        //Usando o método poll()
        int number = numbers.poll();
        System.out.println("Usando poll() para excluir o elemento: "} + number);
    }
}

Resultado da Saída

PriorityQueue: [1, 4, 2]
Elemento2Já foi removido? true
Elemento removido usando poll(): 1

Percorrer a PriorityQueue

Para percorrer os elementos da fila de prioridade, podemos usar o método iterator(). Para usar esse método, devemos importar o pacote java.util.Iterator. Por exemplo,

import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        //Criar fila de prioridade
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.print("Use iterator() para percorrer a PriorityQueue: ");
        //Use o método iterator()
        Iterator<Integer> iterate = numbers.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Resultado da Saída

Use iterator() para percorrer a PriorityQueue: 1, 4, 2,

Outros métodos da PriorityQueue

MétodoDescrição do conteúdo
contains(element)Procure o elemento especificado na fila de prioridade. Se encontrar o elemento, retorne true, caso contrário, retorne false.
size()Retorna o tamanho da fila de prioridade.
toArray()Converta a fila de prioridade em um array e retorne-o.

Comparador da fila de prioridade (comparator)

Em todos os exemplos acima, os elementos da fila de prioridade são recuperados em ordem natural (crescente). Mas, podemos personalizar essa ordem.

Para isso, precisamos criar nossa classe comparator, que implementa a interface Comparator. Por exemplo

import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {
        //Criar fila de prioridade
        PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        numbers.add(3);
        System.out.print("PriorityQueue: " + numbers);}}
    }
}
class CustomComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer number1, Integer number2) {
        int value =  number1.compareTo(number2);
        //Os elementos são ordenados em ordem inversa
        if (value > 0) {
            return -1;
        }
        else if (value < 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

Resultado da Saída

PriorityQueue: [4, 3, 1, 2]

No exemplo acima, criamos uma fila de prioridade, passando a classe CustomComparator como parâmetro.

A classe CustomComparator implementa a interface Comparator.

Em seguida, nós sobrescrevemos o método compare(). Este método agora faz com que a cabeça do elemento seja o maior número.