Java Programming

Implémentations efficaces des multi-ensembles en Java

Spread the love

Un multiensemble, aussi appelé sac, est une collection qui autorise plusieurs instances du même élément. Contrairement aux ensembles, où chaque élément est unique, les multiensembles peuvent contenir des doublons. Bien que la bibliothèque standard de Java n’offre pas directement d’implémentation de multiensemble, plusieurs approches permettent d’obtenir cette fonctionnalité efficacement.

Table des matières

Implémenter des multiensembles en Java

Plusieurs méthodes existent pour créer un multiensemble en Java. Le choix optimal dépend de vos besoins et priorités spécifiques :

  1. Utiliser HashMap : Il s’agit d’une approche simple. Un HashMap associe chaque élément à son nombre d’occurrences. L’ajout d’un élément incrémente son nombre ; la suppression d’un élément le décrémente (en gérant correctement les nombres d’occurrences nuls).
  2. Utiliser TreeMap : Similaire à HashMap, mais TreeMap maintient un ordre trié basé sur l’ordre naturel ou un Comparator personnalisé. Utile lorsque l’ordre des éléments est crucial.
  3. Utiliser le Multiset de Guava : La bibliothèque Guava fournit une implémentation Multiset robuste et optimisée. C’est généralement la méthode préférée en raison de sa commodité et de son efficacité.
  4. Créer une classe personnalisée : Pour des scénarios complexes ou des exigences uniques, une classe personnalisée offre une flexibilité maximale mais exige plus d’efforts de développement.

Exemple d’implémentation avec HashMap

Voici une implémentation de base d’un multiensemble utilisant HashMap :


import java.util.HashMap;
import java.util.Map;

public class MultisetHashMap {
    private Map<String, Integer> elements;

    public MultisetHashMap() {
        elements = new HashMap<>();
    }

    public void add(String element) {
        elements.put(element, elements.getOrDefault(element, 0) + 1);
    }

    public void remove(String element) {
        if (elements.containsKey(element)) {
            int count = elements.get(element);
            if (count > 1) {
                elements.put(element, count - 1);
            } else {
                elements.remove(element);
            }
        }
    }

    public int getCount(String element) {
        return elements.getOrDefault(element, 0);
    }

    public static void main(String[] args) {
        MultisetHashMap multiset = new MultisetHashMap();
        multiset.add("apple");
        multiset.add("banana");
        multiset.add("apple");
        multiset.add("apple");
        System.out.println("Nombre de pommes : " + multiset.getCount("apple")); // Sortie : 3
        multiset.remove("apple");
        System.out.println("Nombre de pommes après suppression : " + multiset.getCount("apple")); // Sortie : 2
    }
}

Utiliser le Multiset de Guava

Le Multiset de Guava offre une solution plus propre et plus efficace :


import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;

public class MultisetGuava {
    public static void main(String[] args) {
        Multiset<String> multiset = HashMultiset.create();
        multiset.add("apple");
        multiset.add("banana");
        multiset.add("apple");
        multiset.add("apple");
        System.out.println("Nombre de pommes : " + multiset.count("apple")); // Sortie : 3
        multiset.remove("apple");
        System.out.println("Nombre de pommes après suppression : " + multiset.count("apple")); // Sortie : 2
        System.out.println("Taille du multiensemble : " + multiset.size()); //Sortie: 3

        for(String element : multiset){
            System.out.println("Element: " + element + ", Count: " + multiset.count(element));
        }
    }
}

N’oubliez pas d’inclure la dépendance Guava dans le fichier de build de votre projet.

Choisir la bonne approche

Pour la plupart des applications, le Multiset de Guava est recommandé en raison de sa robustesse et de son efficacité. L’approche HashMap convient aux scénarios plus simples où vous n’avez pas besoin des fonctionnalités supplémentaires de Guava. Une classe personnalisée n’est nécessaire que pour des situations hautement spécialisées.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *