Я понимаю, что вам нужно иметь список (потому что вам нужно сохранять элементы в том порядке, в котором они были вставлены), а также требуется функциональность набора - предотвращать повторение.
Таким образом, вы можете написать свой собственный класс (скажем, SetList<E>
), который будет подкласс ArrayList<E>
, а также реализовать интерфейс Set<E>
. Для этого вы должны оставить HashSet<E>
в качестве атрибута вашего класса SetList<E>
. Например: private Set<E> set = new HashSet<E>();
Затем просто синхронизируйте вставки и удаления с набором в атрибуте, и если набор уже содержит вставленный элемент, не вставляйте его. Переопределяющий метод add(E element)
будет выглядеть так:
public void add(E element){
if(set.contains(element)){
return;
}
set.add(element);
super.add(element);
}
Для других методов это будет аналогично.
Я сам сделал это некоторое время назад, но потом нашел лучшее решение: GlazedLists .
Это бесплатная библиотека, которая делает все это и многое другое. Я предлагаю вам использовать UniqueList .