96 votes

Existe-t-il une implémentation de la liste sans doublon?

Je connais environ SortedSet , mais dans mon cas, j'ai besoin de quelque chose qui implémente List , et non Set . Alors, y a-t-il une implémentation disponible, dans l'API ou ailleurs?

Cela ne devrait pas être difficile à mettre en œuvre moi-même, mais je me suis dit pourquoi ne pas demander d'abord aux gens ici?

99voto

Calum Points 3160

Il n'y a pas de Java collection de la bibliothèque standard pour ce faire. LinkedHashSet préserve la commande de la même façon à un List,, si vous enveloppez de votre ensemble en List lorsque vous voulez l'utiliser comme un List vous aurez la sémantique que vous voulez.

Sinon, les Communes Collections (ou collections15, pour la version générique) a un List qui fait ce que vous voulez déjà: SetUniqueList.

19voto

user3570018 Points 1

Voici ce que j'ai fait et ça fonctionne.

En supposant que j'ai un ArrayList de collaborer avec la première chose que j'ai faite a été créé un nouveau LinkedHashMap.

LinkedHashSet<E> hashSet = new LinkedHashSet<E>()

Ensuite, j'ai essayer d'ajouter mon nouvel élément à l' LinkedHashSet. La méthode add ne modifie pas l' LinkedHasSet et retourne false si l'élément nouveau est un doublon. Donc, cela devient une condition que je puisse le tester avant de l'ajouter à l' ArrayList.

if (hashSet.add(E)) arrayList.add(E);

C'est une façon simple et élégante pour éviter les doublons d'être ajouté à la liste du réseau. Si vous le souhaitez, vous pouvez encapsuler et de remplacer ajouter une méthode dans une classe qui étend l' ArrayList. N'oubliez pas de traiter avec addAll par boucle à travers les éléments et l'appel de la méthode add.

11voto

Yuval Points 3350

Alors voici ce que j'ai finalement fait. J'espère que ça aidera quelqu'un d'autre.

 class NoDuplicatesList<E> extends LinkedList<E> {
    @Override
    public boolean add(E e) {
        if (this.contains(e)) {
            return false;
        }
        else {
            return super.add(e);
        }
    }

    @Override
    public boolean addAll(Collection<? extends E> collection) {
        Collection<E> copy = new LinkedList<E>(collection);
        copy.removeAll(this);
        return super.addAll(copy);
    }

    @Override
    public boolean addAll(int index, Collection<? extends E> collection) {
        Collection<E> copy = new LinkedList<E>(collection);
        copy.removeAll(this);
        return super.addAll(index, copy);
    }

    @Override
    public void add(int index, E element) {
        if (this.contains(element)) {
            return;
        }
        else {
            super.add(index, element);
        }
    }
}   
 

6voto

dhiller Points 2046

Pourquoi ne pas encapsuler un ensemble avec une liste, trier comme suit:

 new ArrayList( new HashSet() )
 

Cela laisse l’autre implémentation à quelqu'un qui est un vrai maître des collections ;-)

5voto

matt b Points 73770

Vous devriez sérieusement envisager de dhiller de réponse:

  1. Au lieu de s'inquiéter à propos de l'ajout de vos objets à un double-moins de la Liste, ajoutez-les à un Ensemble (toute mise en œuvre), qui, par nature, de filtrer les doublons.
  2. Lorsque vous devez appeler la méthode qui nécessite une Liste, de l'envelopper dans un new ArrayList(set) (ou new LinkedList(set), peu importe).

Je pense que la solution que vous avez posté avec l' NoDuplicatesList a des problèmes, surtout avec l' contains() méthode, en plus de votre classe ne gère pas le contrôle de doublon dans la Collection passée à votre addAll() méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X