2010-10-13 2 views
6

Я могу расширить LinkedList и реализовать Set, так что у меня есть список без дубликатов. Мне интересно, если такая реализация уже не существует?Реализация списка, которая представляет собой как набор списков (последовательность)?

Все, что я планирую сделать, это переопределить метод add(e), чтобы сначала просмотреть элемент, и если он не добавлен. Что-то вроде:

add(E){ 
    if(get(E) == null) super.add(E); 
} 

ответ

5

реализации Нет Java существует в стандартных коллекций.

Однако вы можете взглянуть на SetUniqueList от Common Collections, который может быть вдоль линий того, что вы ищете.

+0

Это то, что я искал. Повторяя повторное использование и простоту, вы бы рекомендовали просто создать мой класс или импортировать эту библиотеку из maven? Кроме того, почему он не связан со стандартной реализацией списка? – simpatico

+2

Я бы импортировал эту библиотеку, если вы не почувствуете необходимость воссоздать ее самостоятельно, этот выбор за вами. –

+0

@simpatico: Вы можете поддержать @ ответ Энтони, если найдете его полезным. :). Ура! – ivorykoder

6

Возможно, LinkedHashSet делает то, что вы хотите. Он сохраняет элементы в (по умолчанию) порядке вставки.

Невозможно реализовать оба интерфейса одновременно (по крайней мере, если вы хотите следовать спецификациям для списка и набора), поскольку конфликтуют определения хеш-кода.

Возвращает значение хеш-кода для этого списка. Хэш-код списка определяется как результат следующего расчета:

hashCode = 1; 
    Iterator i = list.iterator(); 
    while (i.hasNext()) { 
     Object obj = i.next(); 
     hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); 
    } 

против

Возвращает значение хэш-кода для этого набора. Хэш-код набора определяется как сумма хэш-кодов элементов в наборе, где хэш-код нулевого элемента определяется как нуль. Это гарантирует, что s1.equals (s2) подразумевает, что s1.hashCode() == s2.hashCode() для любых двух наборов s1 и s2, как того требует общий контракт метода Object.hashCode.

+1

LinkedHashSet не ведет себя как истинный список, потому что вы не можете получать, вставлять, обновлять или удалять позиционно. И вы можете реализовать 'equals' и' hashcode' в гипотетическом классе списка, чтобы они не полностью подчинялись соответствующим контрактам интерфейса/суперкласса. –

+0

Да, вот почему я сказал «может быть». – Thilo

+0

это то, что я использовал. Тем не менее, я просто заметил, что при извлечении их из БД с помощью JPA2 они не упорядочены. Это потому, что у меня было объявление как Set. Я отправлю еще один вопрос. – simpatico

Смежные вопросы