web-dev-qa-db-fra.com

Java: évitez d'insérer des doublons dans une liste

Je suis novice à Java. J'ai une ArrayList et je veux éviter les doublons lors de l'insertion. Ma ArrayList est 

ArrayList<kar> karList = new ArrayList<kar>();

et le champ que je veux vérifier est:

 kar.getinsertkar().

J'ai lu que je pouvais utiliser HashSet ou HashMap mais je n'en ai aucune idée.

12
user2766131

Lorsque vous souhaitez éviter les doublons, vous souhaitez utiliser une variable Set.

Dans ce cas, un HashSet serait parfait pour vous.

HashSet karSet = new HashSet();
karSet.add(foo);
karSet.add(bar);
karSet.add(foo);
System.out.println(karSet.size());
//Output is 2

Par souci d'exhaustivité, je vous suggérerais également d'utiliser la version générique (paramétrée) de la classe, en supposant que Java 5 ou supérieur.

HashSet<String> stringSet = new HashSet<String>();
HashSet<Integer> intSet = new HashSet<Integer>();
...etc...

Cela vous donnera également une certaine sécurité pour insérer des articles dans votre ensemble.

23
Mike Clark

Utilisez une HashSet au lieu d'une ArrayList. Toutefois, pour que la variable HashSet fonctionne réellement correctement, vous devez redéfinir les méthodes equals() et hashCode() de la classe/des objets insérés dans la variable HashSet.

Exemple d'ennemi:

 Set<MyObject> set = new HashSet<MyObject>();
 set.add(foo);
 set.add(bar);

 public class MyObject {
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof MyObject)
             return (this.id = obj.id) 
         else
             return false;
     }
     // now override hashCode()
}

Veuillez vous référer à la documentation suivante pour remplacer hashCode() et equals().

6
blackpanther

Un ensemble est simplement une collection qui ne peut contenir aucun doublon, ce qui en fait un son parfait pour vous.

C'est aussi très simple à mettre en œuvre. Par exemple:

Set<String> mySet = new HashSet<String>();

Cela vous fournirait un ensemble pouvant contenir des objets de type String.

Ajouter à l'ensemble est aussi simple:

mySet.add("My first entry!");

Par définition, vous pouvez ajouter ce que vous voulez et ne jamais tomber sur un doublon. 

S'amuser!

EDIT: Si vous décidez de ne pas utiliser d'ArrayList, il est simple de voir si un objet est déjà dans la liste avant de l'ajouter. Par exemple:

public void addToList(String newEntry){
    if(!myList.contains(newEntry))
        myList.add(newEntry);
}

Remarque: Tous mes exemples supposent que vous utilisez des objets String, mais ils peuvent facilement être échangés contre tout autre type d'objet.

5
r0t0xd

Vous pouvez utiliser LinkedHashSet pour éviter les éléments en double et conserver l'ordre d'insertion.

http://docs.Oracle.com/javase/7/docs/api/Java/util/LinkedHashSet.html

4
Kent

Vous devez utiliser n’importe quelle implémentation de Set, par exemple vous pouvez utiliser HashSet. Si vous voulez add objet personnalisé kar dans votre HashSet, vous besoin de overrideequals et hashcode, méthode . Vous pouvez en savoir plus sur equals et hashcode, voir

0
Sajan Chandran

Vous pouvez implémenter votre propre liste qui étend LinkedList et remplacer ses méthodes add:

  1. public boolean add (E e)
  2. public void add (int index, élément E)
  3. public boolean addAll (Collection collection)
  4. public boolean addAll (int index, Collection collection)
0
Danail Tsvetanov