web-dev-qa-db-fra.com

Comment empêcher l'ajout d'objets en double à une liste de tableaux

Duplicata possible:
Empêcher les entrées en double dans l'arraylist

J'ai un arraylist d'une classe particulière C.

List<C> myList = new ArrayList<C>();

La classe C a deux attributs à savoir.

String str1;
String str2;

Maintenant, au fur et à mesure que j'ajoute des objets de type C à ma liste ArrayList, je veux vérifier s'il existe déjà un objet dans la liste avec les valeurs de str1 et str2 correspondant aux valeurs des paramètres (str1 et str2) de l'objet Je suis sur le point d'ajouter.

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 paramètres?

16
London guy

Vous devez remplacer la méthode equals dans la 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 objet égal.

Ceci n'est pas testé, vous voudrez peut-être une gestion supplémentaire des erreurs.

Si vous remplacez la méthode equals comme ceci, vous devez également vous assurer que vous remplacez 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, mais vous devrez toujours remplacer la méthode equals/hashcode pour que le l'exemple ci-dessus peut être mieux utilisé en conjonction avec la réponse de Karthiks ci-dessus.

19
cowls

Lorsque vous devez rechercher des doublons ou garantir des valeurs uniques, pensez à utiliser une structure de données de type Set , plutôt qu'une liste.

Vous pouvez choisir l'une des options ci-dessous -

  • HashSet

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

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

Définir automatiquement n'autorise que des valeurs uniques. Les tentatives d'ajout de valeurs qui existaient précédemment échoueront.

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

39
Karthik T
if (yourList.contains(Object object))
{
    // do not add
}
12
Romczyk