PriorityQueue en français

Qu'est-ce qu'une PriorityQueue ?

La PriorityQueue est une implémentation de l'interface Queue en Java. Elle permet de stocker des éléments dans une collection ordonnée en fonction d'un ordre naturel ou selon un Comparator personnalisé. Dans ce type de file d'attente, l'élément ayant la valeur la plus faible se trouve en tête, et les méthodes de la Queue telles que .peek() et .poll() agissent sur cet élément.

Syntaxe de la PriorityQueue

Pour utiliser une PriorityQueue, vous devez d'abord importer le package approprié :

import java.util.PriorityQueue;

En initialisant une PriorityQueue, vous devrez spécifier le type de données qu'elle contiendra :

PriorityQueue q = new PriorityQueue();

Ici, DataType est le type d'élément que vous souhaitez stocker.

Si vous souhaitez appliquer un ordre de tri personnalisé, vous pouvez créer un Comparator comme suit :

import java.util.PriorityQueue;
import java.util.Comparator;
PriorityQueue q = new PriorityQueue(new CustomComparator());

Ajouter des éléments

Pour ajouter de nouveaux éléments à la PriorityQueue, vous utilisez la méthode .add(). Voici comment cela fonctionne :

priorityqueue.add(item);

item est l'élément à ajouter et doit correspondre au type de la PriorityQueue.

Exemple d'ajout

Voici un exemple qui initialise une PriorityQueue de chaînes de caractères :

import java.util.PriorityQueue;
public class Main {
    public static PriorityQueue SetupPriorityQueue() {
        PriorityQueue result = new PriorityQueue();
        result.add("Chou");
        result.add("Pizza");
        result.add("Saucisse");
        result.add("Pommes de terre");
        result.add("Salade");
        return result;
    }
    public static void main(String[] args) {
        PriorityQueue food = SetupPriorityQueue();
        System.out.println(food);
    }
}

Ce code affichera : [Chou, Pizza, Saucisse, Pommes de terre, Salade].

Supprimer des éléments spécifiques

Pour retirer un élément spécifique de la PriorityQueue, vous pouvez utiliser la méthode .remove(). La syntaxe est la suivante :

priorityqueue.remove(item);

Exemple de suppression

Modifions la méthode principale de l'exemple précédent :

public static void main(String[] args) {
    PriorityQueue food = SetupPriorityQueue();
    food.remove("Pizza");
    while (food.size() > 0) {
        System.out.println(food.poll());
    }
}

Ce code affichera :

Chou
Pommes de terre
Salade
Saucisse

Vérifier l'existence d'un élément

Pour vérifier si un élément donné est présent dans la PriorityQueue, utilisez la méthode .contains(). Voici la syntaxe :

boolean result = priorityqueue.contains(item);

Exemple de vérification

Voici une modification de la méthode principale :

public static void main(String[] args) {
    PriorityQueue food = SetupPriorityQueue();
    if (food.contains("Noix")) {
        System.out.println("Avertissement allergène !");
    } else {
        System.out.println("Sûr à manger.");
    }
}

Ce code affichera : Sûr à manger.

Obtenir la taille de la PriorityQueue

Pour connaître le nombre d'éléments dans la PriorityQueue, vous pouvez utiliser la méthode .size() :

int ItemCount = priorityqueue.size();

Exemple de taille

Voici un exemple de code pour afficher la taille :

public static void main(String[] args) {
    PriorityQueue food = SetupPriorityQueue();
    while (food.size() > 0) {
        System.out.println(food.poll());
        System.out.println(food.size());
    }
}

Le résultat affichera :

Chou
4
Pizza
3
Pommes de terre
2
Salade
1
Saucisse
0

Parcourir une PriorityQueue

Vous pouvez parcourir une PriorityQueue en utilisant une boucle for-each, mais notez que les éléments seront renvoyés dans l'ordre où ils ont été ajoutés et non dans l'ordre de priorité.

Exemple de parcours

public static void main(String[] args) {
    PriorityQueue food = SetupPriorityQueue();
    for (String i : food) {
        System.out.println(i);
    }
}

Ce code affichera :

Chou
Pizza
Saucisse
Pommes de terre
Salade

Méthodes .peek() et .poll()

Les méthodes de la Queue .peek() et .poll() fonctionnent sur l'élément en tête de la PriorityQueue.

  • .peek() renvoie l'élément en tête sans le retirer.
  • .poll() retire l'élément en tête et renvoie sa valeur.

Exemple d'utilisation de .peek() et .poll()

Voici un exemple modifié :

public static void main(String[] args) {
    PriorityQueue food = SetupPriorityQueue();
    System.out.println(food.peek());
    while (food.size() > 0) {
        System.out.println(food.poll());
    }
    System.out.println(food.peek());
}

Ce code affichera :

Chou
Chou
Pizza
Pommes de terre
Salade
Saucisse
null

Utiliser un Comparator personnalisé

Pour établir un ordre de priorité différent de celui par défaut, il est nécessaire d'utiliser un Comparator personnalisé. Ce dernier est une classe spécialisée qui aide la PriorityQueue à déterminer l'ordre des éléments de même type de données.

Vous devrez implémenter l'interface Comparator<DataType> et redéfinir la méthode de comparaison :

import java.util.PriorityQueue;
import java.util.Comparator;
static class CustomComparator implements Comparator {
    @Override
    public int compare(DataType item1, DataType item2) {
        // renvoyer un positif si item1 < item2, et négatif si item1 > item2
    }
}
PriorityQueue q = new PriorityQueue(new CustomComparator());

Exemple de Comparator personnalisé

Voici un exemple inversant les priorités des valeurs de chaîne dans la PriorityQueue :

import java.util.PriorityQueue;
import java.util.Comparator;

public class Main {
    static class CustomComparator implements Comparator {
        @Override
        public int compare(String item1, String item2) {
            return item1.compareTo(item2) < 0 ? 1 : -1;
        }
    }

    public static void main(String[] args) {
        PriorityQueue food = new PriorityQueue(new CustomComparator());
        food.add("Chou");
        food.add("Pizza");
        food.add("Saucisse");
        food.add("Pommes de terre");
        food.add("Salade");
        while (food.size() > 0) {
            System.out.println(food.poll());
        }
    }
}

Ce code affichera :

Saucisse
Salade
Pommes de terre
Pizza
Chou