Voici une extension de ArrayList qui rejette les doublons:
public class NoDupeList<E> extends ArrayList<E>{
private static final long serialVersionUID = -2682691450003022201L;
public NoDupeList(){
super();
}
public NoDupeList(final Collection<? extends E> c){
super(c instanceof Set<?> ? c : new LinkedHashSet<E>(c));
}
public NoDupeList(final int initialCapacity){
super(initialCapacity);
}
@Override
public boolean add(final E e){
return !this.contains(e) && super.add(e);
};
@Override
public boolean addAll(final Collection<? extends E> c){
final List<E> intermediate = new ArrayList<E>(c);
intermediate.removeAll(this);
return super.addAll(intermediate);
}
@Override
public void add(final int index, final E element){
if(!this.contains(element)){
super.add(index, element);
}
};
@Override
public E set(final int index, final E element){
if(this.contains(element) && !this.get(index).equals(element)){
throw new IllegalArgumentException("This would cause a duplicate");
}
return super.set(index, element);
};
}
La seule chose que je ne peux pas traiter est la méthode set(). Ma solution est de lancer un IllegalArgumentException
si cela provoque un doublon, mais peut-être que l'on devrait généralement laisser cette méthode lancer un UnsupportedOperationException
à la place.
Quoi qu'il en soit, voici une méthode d'essai:
@Test
public void testNoDupeList() throws Exception{
final List<String> list =
new NoDupeList<String>(Arrays.asList("abc", "def", "abc"));
assertEquals(list, Arrays.asList("abc", "def"));
list.addAll(Arrays.asList("abc", "def", "ghi"));
assertEquals(list, Arrays.asList("abc", "def", "ghi"));
try{
list.set(2, "abc");
fail("This should have caused an Exception");
} catch(final Exception e){}
};
LinkedHashSet est une implémentation de l'interface Set ... Pourquoi recommandez-vous celui-ci plutôt qu'un autre? – pgras
@pgras, peut-être parce que l'ordre dans lequel les éléments sont ajoutés est gardé intact, tout comme une liste. –
@Wolfgang, @Bart K - le problème est que LinkedHashSet n'est PAS une liste. Il implémente l'API Set et ne vous permet pas d'obtenir, mettre à jour ou insérer ou supprimer des éléments positionnellement. –