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
- Exemple d’implémentation avec HashMap
- Utiliser le Multiset de Guava
- Choisir la bonne approche
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 :
- Utiliser
HashMap
: Il s’agit d’une approche simple. UnHashMap
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). - Utiliser
TreeMap
: Similaire àHashMap
, maisTreeMap
maintient un ordre trié basé sur l’ordre naturel ou unComparator
personnalisé. Utile lorsque l’ordre des éléments est crucial. - Utiliser le
Multiset
de Guava : La bibliothèque Guava fournit une implémentationMultiset
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é. - 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.