Classe PriorityQueue de Java : Guide pour Débutants

Introduction

Bonjour, futurs programmeurs Java !aujourd'hui, nous allons plonger dans le monde fascinant de PriorityQueue en Java. Ne vous inquiétez pas si vous ne l'avez jamais entendu avant – nous commencerons de zéro et nous progresserons ensemble. Pensez à une PriorityQueue comme une sorte de file (ou queue) spéciale où la personne ou l'item le plus important passe toujours en premier. Excitant, non ? Commençons !

Java - PriorityQueue

Déclaration de Classe

En Java, la classe PriorityQueue fait partie du Framework de Collections Java. C'est comme une liste VIP pour vos données ! Voici comment la déclarer :

import java.util.PriorityQueue;

PriorityQueue<ElementType> pq = new PriorityQueue<>();

Remplacez ElementType par le type de données que vous souhaitez stocker, comme Integer, String, ou même vos propres objets personnalisés (mais nous y viendrons plus tard).

Paramètres

Lors de la création d'une PriorityQueue, vous pouvez spécifier quelques paramètres optionnels :

  1. Capacité initiale : Nombre d'items qu'elle peut contenir initialement.
  2. Comparateur : Un objet spécial qui décide de l'ordre des éléments.

Voici un exemple :

PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());

Cela crée une PriorityQueue qui peut initialement contenir 10 entiers, et ils seront classés du plus grand au plus petit.

Constructeurs de Classe

PriorityQueue propose plusieurs constructeurs. Pensez aux constructeurs comme des recettes différentes pour créer votre file. Voici les principaux :

Constructeur Description
PriorityQueue() Crée une file vide avec une capacité initiale par défaut (11)
PriorityQueue(int initialCapacity) Crée une file vide avec la capacité initiale spécifiée
PriorityQueue(Comparator<? super E> comparator) Crée une file vide avec le comparateur spécifié
PriorityQueue(Collection<? extends E> c) Crée une file contenant les éléments de la collection spécifiée

Voyons un exemple :

PriorityQueue<String> fruitQueue = new PriorityQueue<>();
PriorityQueue<Integer> numberQueue = new PriorityQueue<>(20);

Dans la première ligne, nous créons une file pour les chaînes de caractères (peut-être des noms de fruits ?). Dans la seconde, nous créons une file pour les nombres qui peut initialement contenir 20 items.

Méthodes de Classe

Maintenant, examinons quelques-unes des choses sympas que vous pouvez faire avec une PriorityQueue :

Méthode Description
add(E e) Ajoute un élément à la file
offer(E e) Ajoute un élément à la file (retourne false si pleine)
peek() Récupère, mais ne retire pas, la tête de la file
poll() Récupère et retire la tête de la file
remove(Object o) Supprime une instance unique de l'élément spécifié
size() Retourne le nombre d'éléments dans la file
clear() Supprime tous les éléments de la file

Voyons ces exemples en action :

PriorityQueue<String> animalQueue = new PriorityQueue<>();

animalQueue.add("Chien");
animalQueue.offer("Chat");
animalQueue.add("Éléphant");

System.out.println("Peek : " + animalQueue.peek()); // Affiche : Peek : Chat
System.out.println("Poll : " + animalQueue.poll()); // Affiche : Poll : Chat
System.out.println("Taille : " + animalQueue.size()); // Affiche : Taille : 2

Notez comment "Chat" est venu en premier ? C'est parce que PriorityQueue trie les chaînes de caractères alphabétiquement par défaut.

Méthodes Héritées

PriorityQueue hérite également de méthodes de ses classes parentes. C'est comme avoir des fonctionnalités bonus ! Certaines utiles incluent :

  • contains(Object o) : Vérifie si la file contient l'élément spécifié
  • toArray() : Retourne un tableau contenant tous les éléments de la file
  • iterator() : Retourne un itérateur sur les éléments de la file

Voici un exemple rapide :

PriorityQueue<Integer> numberQueue = new PriorityQueue<>();
numberQueue.add(5);
numberQueue.add(2);
numberQueue.add(8);

System.out.println("Contient 2 ? " + numberQueue.contains(2)); // Affiche : Contient 2 ? true

Object[] array = numberQueue.toArray();
System.out.println("Premier élément : " + array[0]); // Affiche : Premier élément : 2

Exemple d'Ajout d'un Élément à une Priority Queue

Mettons tout cela en pratique avec un exemple amusant. Imaginez que nous organisons une fête et que nous voulons saluer nos invités dans l'ordre de leur arrivée :

import java.util.PriorityQueue;

public class PartyGreeter {
public static void main(String[] args) {
PriorityQueue<Guest> guestQueue = new PriorityQueue<>();

guestQueue.add(new Guest("Alice", 18.30));
guestQueue.add(new Guest("Bob", 18.15));
guestQueue.add(new Guest("Charlie", 18.45));

while (!guestQueue.isEmpty()) {
Guest guest = guestQueue.poll();
System.out.println("Bienvenue, " + guest.name + " ! Vous êtes arrivé à " + guest.arrivalTime);
}
}

static class Guest implements Comparable<Guest> {
String name;
double arrivalTime;

Guest(String name, double arrivalTime) {
this.name = name;
this.arrivalTime = arrivalTime;
}

@Override
public int compareTo(Guest other) {
return Double.compare(this.arrivalTime, other.arrivalTime);
}
}
}

Ce programme affichera :

Bienvenue, Bob ! Vous êtes arrivé à 18.15
Bienvenue, Alice ! Vous êtes arrivé à 18.3
Bienvenue, Charlie ! Vous êtes arrivé à 18.45

Dans cet exemple, nous avons créé une classe Guest personnalisée et avons dit à Java comment comparer les invités en fonction de leur heure d'arrivée. La PriorityQueue a ensuite trié nos invités automatiquement !

Et voilà ! Vous avez juste pris vos premiers pas dans le monde des PriorityQueues en Java. N'oubliez pas, la pratique fait le maître, donc n'hésitez pas à expérimenter avec ces concepts. Qui sait ? Peut-être que vous utiliserez une PriorityQueue pour organiser la liste des invités de votre prochaine fête !

Credits: Image by storyset