Comment empêcher l’ajout d’objects en double à un ArrayList

Dupliquer possible:
Empêcher les entrées en double dans une liste

J’ai un aryliste d’une classe particulière C.

List myList = new ArrayList(); 

La classe C a deux atsortingbuts à savoir.

 Ssortingng str1; Ssortingng str2; 

Maintenant, au fur et à mesure que j’ajoute des objects de type C à la listeArrayList, je veux vérifier s’il existe déjà un object dans la liste avec les valeurs de str1 et str2 correspondant aux valeurs des parameters (str1 et str2) de l’object. Je suis sur le point d’append.

Existe-t-il un moyen efficace de le faire sans avoir à parcourir chaque fois la liste complète et à vérifier la correspondance entre les parameters?

Vous devez remplacer la méthode equals en classe C.

par exemple

 public boolean equals(Object c) { if(c !instanceof C) { return false; } C that = (C)c; return this.str1.equals(that.getStr1()) && this.str2.equals(that.getStr2()); } 

Ensuite, vous pouvez appeler myList.contains (viz) pour voir si la liste contient déjà un object égal.

Ceci n’a pas été testé, vous souhaiterez peut-être un traitement supplémentaire des erreurs.

Si vous substituez la méthode equals à cette méthode, vous devez également vous assurer de remplacer la méthode hashcode (). Voir: http://www.technofundo.com/tech/java/equalhash.html

Edit : Comme indiqué dans les commentaires, l’implémentation de l’ensemble sera plus efficace, bien que vous deviez toujours écraser la méthode equals / hashcode pour que l’exemple ci-dessus soit utilisé au mieux avec la réponse de Karthiks ci-dessus.

Lorsque vous devez vérifier les doublons ou garantir des valeurs uniques, envisagez d’utiliser une structure de données semblable à un ensemble plutôt qu’une liste.

Vous pouvez choisir l’un des choix ci-dessous –

  • HashSet

    • Accès plus rapide – Accès O (1) en gros.
    • non sortingé
    • Table de hachage utilisée comme stockage de base.
  • TreeSet

    • Accès plus lent (par rapport à HashSet) – O (log (n))
    • valeurs sortingées automatiquement.
    • Arbre rouge-noir utilisé comme stockage de base.

Définir automatiquement n’autorise que des valeurs uniques. Les tentatives pour append des valeurs qui existaient auparavant échoueront.

Notez que pour que cela fonctionne, vous devrez remplacer equals et hashcode pour indiquer au Set comment comparer vos objects. Cette étape est mieux expliquée à Quels problèmes faut-il prendre en compte lors de la substitution d’égaux et de hashCode en Java?

 if (yourList.contains(Object object)) { // do not add }