Comment maintenir une liste unique en Java?

Comment créer une liste unique en Java.

Pour le moment, j’utilise HashMap pour le faire car la clé est écrasée et à la fin, nous pouvons obtenir HashMap.getKeySet() qui serait unique. Mais je suis sûr qu’il devrait y avoir une meilleure façon de le faire car la partie valeur est gaspillée ici.

Vous pouvez utiliser une implémentation Set :

Quelques infos du JAVADoc:

Une collection qui ne contient aucun élément en double . Plus formellement, les ensembles ne contiennent aucune paire d’éléments e1 et e2 tels que e1.equals (e2) et au plus un élément nul. Comme son nom l’indique, cette interface modélise l’abstraction d’ensemble mathématique.

Note: Il faut faire très attention si des objects mutables sont utilisés comme éléments de l’ensemble. Le comportement d’un ensemble n’est pas spécifié si la valeur d’un object est modifiée d’une manière qui affecte les comparaisons d’égal alors que l’object est un élément de l’ensemble. Un cas particulier de cette interdiction est qu’il n’est pas permis à un ensemble de se contenir en tant qu’élément. »

Ce sont les implémentations:

  • HashSet

    Cette classe offre des performances à temps constant pour les opérations de base (ajout, suppression, contient et taille), en supposant que la fonction de hachage disperse correctement les éléments parmi les compartiments. Itérer sur cet ensemble nécessite du temps proportionnel à la sum de la taille de l’instance HashSet (le nombre d’éléments) plus la “capacité” de l’instance HashMap de sauvegarde (le nombre de compartiments). Il est donc très important de ne pas définir la capacité initiale trop élevée (ou le facteur de charge trop bas) si les performances de l’itération sont importantes.

    Lors de l’itération d’un HashSet l’ordre des éléments HashSet n’est pas défini.

  • LinkedHashSet

    Implémentation de la table de hachage et de la liste chaînée de l’interface Set, avec un ordre d’itération prévisible. Cette implémentation diffère de HashSet dans la mesure où elle gère une liste à double liaison exécutant toutes ses entrées. Cette liste chaînée définit l’ordre d’itération, c’est-à-dire l’ordre dans lequel les éléments ont été insérés dans l’ensemble (ordre d’insertion). Notez que l’ordre d’insertion n’est pas affecté si un élément est réinséré dans l’ensemble. (Un élément e est réinséré dans un ensemble s si s.add (e) est invoqué lorsque s.contains (e) est renvoyé true immédiatement avant l’invocation.)

    Donc, la sortie du code ci-dessus …

      Set linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add(3); linkedHashSet.add(1); linkedHashSet.add(2); for (int i : linkedHashSet) { System.out.println(i); } 

    … sera nécessairement

     3 1 2 
  • TreeSet

    Cette implémentation garantit un coût de log (n) garanti pour les opérations de base (append, supprimer et contenir). Par défaut, les éléments renvoyés lors de l’itération sont sortingés par leur ” ordre naturel “, donc le code ci-dessus …

      Set treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); for (int i : treeSet) { System.out.println(i); } 

    … va sortir ceci:

     1 2 3 

    (Vous pouvez également transmettre une instance Comparator à un constructeur TreeSet , ce qui lui permet de sortinger les éléments dans un ordre différent.)

    Notez que l’ordre géré par un ensemble (qu’un comparateur explicite soit fourni ou non) doit être cohérent avec les égaux s’il doit implémenter correctement l’interface Set. (Voir Comparable ou Comparator pour une définition précise de la cohérence avec les égaux.) En effet, l’interface Set est définie en termes d’opération equals, mais une instance TreeSet effectue toutes les comparaisons d’éléments en utilisant sa méthode compareTo (ou compare). les éléments jugés égaux par cette méthode sont, du sharepoint vue de l’ensemble, égaux. Le comportement d’un ensemble est bien défini même si son classement n’est pas cohérent avec les égaux; il ne parvient tout simplement pas à respecter le contrat général de l’interface Set.

Je veux clarifier certaines choses ici pour l’affiche originale à laquelle d’autres ont fait allusion, mais qui n’ont pas été explicitement énoncées. Lorsque vous dites que vous voulez une liste unique, c’est la définition même d’un ensemble ordonné. Certaines autres différences clés entre l’interface Set et l’interface List sont que List vous permet de spécifier l’index d’insertion. Donc, la question est de savoir si vous avez vraiment besoin de l’interface de liste (c’est-à-dire pour la compatibilité avec une bibliothèque tierce, etc.) ou pouvez-vous repenser votre logiciel pour utiliser l’interface Set? Vous devez également tenir compte de ce que vous faites avec l’interface. Est-il important de trouver des éléments par leur index? Combien d’éléments attendez-vous dans votre set? Si vous voulez avoir beaucoup d’éléments, la commande est-elle importante?

Si vous avez vraiment besoin d’une liste qui n’a qu’une contrainte unique, il y a la classe Apache Common Utils org.apache.commons.collections.list.SetUniqueList qui vous fournira l’interface List et la contrainte unique. Attention, cela casse l’interface de la liste. Vous obtiendrez cependant de meilleures performances si vous devez chercher dans la liste par index. Si vous pouvez gérer l’interface Set et que vous avez un plus petit dataset, alors LinkedHashSet pourrait être un bon moyen de le faire. Tout dépend de la conception et de l’intention de votre logiciel.

Encore une fois, chaque collection présente certains avantages et inconvénients. Certaines insertions rapides mais lentes, certaines ont des lectures rapides mais des insertions lentes, etc. Il est logique de consacrer beaucoup de temps à la documentation sur les collections pour mieux comprendre les détails plus fins de chaque classe et interface.

Utiliser un new HashSet Un exemple:

 import java.util.HashSet; import java.util.Set; public class MainClass { public static void main(Ssortingng args[]) { Ssortingng[] name1 = { "Amy", "Jose", "Jeremy", "Alice", "Pasortingck" }; Ssortingng[] name2 = { "Alan", "Amy", "Jeremy", "Helen", "Alexi" }; Ssortingng[] name3 = { "Adel", "Aaron", "Amy", "James", "Alice" }; Set letter = new HashSet(); for (int i = 0; i < name1.length; i++) letter.add(name1[i]); for (int j = 0; j < name2.length; j++) letter.add(name2[j]); for (int k = 0; k < name3.length; k++) letter.add(name3[k]); System.out.println(letter.size() + " letters must be sent to: " + letter); } } 

Vous pouvez simplement utiliser un HashSet pour gérer une collection d’objects uniques. Si les valeurs Integer de votre map sont importantes, vous pouvez utiliser la méthode containsKey de maps pour vérifier si votre clé est déjà dans la map.

HashSet (ou) toute implémentation Set peut faire le travail pour vous. Set ne permet pas les doublons.

Voici javadoc pour HashSet.

Vous souhaiterez peut-être utiliser l’une des classes d’implémentation de l’interface java.util.Set par exemple la classe de collection java.util.HashSet .

Une collection qui ne contient aucun élément en double. Plus formellement, les ensembles ne contiennent aucune paire d’éléments e1 et e2 tels que e1.equals (e2) et au plus un élément nul. Comme son nom l’indique, cette interface modélise l’abstraction d’ensemble mathématique.

Je ne sais pas à quel point c’est efficace, mais a travaillé pour moi dans un contexte simple.

 List uniqueNumbers = new ArrayList<>(); public void AddNumberToList(int num) { if(!uniqueNumbers .contains(num)) { uniqueNumbers .add(num); } }