Передача списка в Set Constructor, происходит ли фильтрация по порядку? - PullRequest
3 голосов
/ 18 ноября 2011

Я получаю список из запроса JPA, упорядоченного по действующей дате. Могут быть повторяющиеся записи, за исключением столбца даты, и я буду заказывать им самую последнюю дату в первую очередь (desc). Все, что я хочу в наборе, - это все записи с самой новой действующей датой; в наборе недопустимы дубликаты со старыми эффективными датами.

Если я создаю HashSet путем передачи этого Списка в конструктор, будет ли новый Набор содержать только первые записи в Списке, только те, которые имеют «новейшие» эффективныеДаты?

Другими словами, инициализируются ли наборы в порядке списка, когда они создаются из списка?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 18 ноября 2011

Если вы создаете HashSet из коллекции с дубликатами, только первый из каждого дубликата будет добавлен в хэш-набор.

Он добавляет элементы в списке в порядке и метод add не перезаписывает дубликаты.

Хотя это поведение не указано, вряд ли изменится.

1 голос
/ 18 ноября 2011

Под "дублирующимися записями" подразумеваете ли вы, что по вашему запросу возвращаются отдельные экземпляры строк / объектов и что вы определили equals / hashCode таким образом, чтобы они не включали это полеffectiveDate?Другими словами, если вы говорите, что list.get (i) и list.get (j) являются дубликатами, кроме даты, вы имеете в виду, что list.get (i)! = List.get (j) и list.get (i) .equals (list.get (j)).

Если это то, что вы имели в виду, то я считаю, что первый, вставленный в сет, выигрывает.

0 голосов
/ 18 ноября 2011

С точки зрения java Collection Framework,

Если вы хотите сохранить порядок только во время вставки, HashSet сделает и сохранит первые появления там, удалив все дубликаты.Однако, если вы хотите сохранить порядок во время итераций, используйте LinkedHashSet

. В случае JPA

вы можете найти запрос select distinct полезным для фильтрации дубликатов, избегая избыточной обработки Коллекции

select distinct a from ....

см. Как создать отдельный запрос в HQL

0 голосов
/ 18 ноября 2011

SLaks уже опередил меня до отметки HashSet, но если у вас есть возможность использовать LinkedHashSet, это может быть лучше.

Мое чтение javadoc для LinkedHashSet указывает, что первый дубликат гарантированно будет сохранен:

Обратите внимание, что порядок вставки не изменяется, если элемент повторно вставляется в набор. (Элемент e повторно вставляется в набор s, если s.add (e) вызывается, когда s.contains (e) возвращает true непосредственно перед вызовом.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...