86 votes

Existe-t-il un jeu de préservation de l'ordre d'insertion en Java?

J'essaie de trouver une implémentation de java.util.List et java.util.Set en même temps en Java. Je souhaite que cette classe n'autorise que des éléments uniques (en tant que Set ) et conserve leur ordre (comme List ). Existe-t-il dans JDK 6?

ps. Il est important d'avoir la méthode List<T>#add(int, T) .

208voto

Jon Skeet Points 692016

TreeSet est triée en fonction de l'élément de commande; - LinkedHashSet conserve l'ordre d'insertion. Espérons que l'un de ceux est ce que vous avez été au bout :)

EDIT: Bon, maintenant que vous avez spécifié que vous voulez être en mesure d'insérer à l' arbitraire de l'emplacement, je soupçonne que vous devrez écrire votre propre, il suffit de créer une classe contenant un HashSet<T> et ArrayList<T>; lors de l'ajout d'un élément, vérifiez qu'il soit ou non dans le jeu avant de l'ajouter à la liste.

30voto

Mechkov Points 2603

LinkedHashSet est la réponse.

Itération ordonnant et unicité.

http://download.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html

12voto

Peter Lawrey Points 229686

Voulez-vous dire comme LinkedHashSet ? Cela préserve l'ordre d'entrée, mais n'autorise pas les doublons.

IMHO, c'est une exigence inhabituelle, mais vous pouvez écrire une liste sans doublons.

 class SetList<T> extends ArrayList<T> {
    @Override
    public boolean add(T t) {
        return !super.contains(t) && super.add(t);
    }

    @Override
    public void add(int index, T element) {
        if (!super.contains(element)) super.add(index, element);
    }

    @Override
    public boolean addAll(Collection<? extends T> c) {
        boolean added = false;
        for (T t : c)
            added |= add(t);
        return added;
    }

    @Override
    public boolean addAll(int index, Collection<? extends T> c) {
        boolean added = false;
        for (T t : c)
            if (!super.contains(t)) {
                super.add(index++, t);
                added = true;
            }
        return added;
    }
}
 

4voto

Ondrej Bozek Points 1988

Si vous ne vous limitez pas à JDK 6, vous pouvez utiliser la bibliothèque de collections commune Apache , qui correspond exactement à vos besoins - ListOrderedSet . C'est comme List et Set réunis :)

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