Различные события могут иметь одну и ту же метку времени
и сортировать события по метке времени
Это последнее требование несколько неясно.Должен ли итератор коллекции возвращать экземпляры в отсортированном порядке?Или должна ли коллекция, если вы poll()
в цикле, вернуть свое прежнее содержимое в отсортированном порядке?
iterator()
возвращает элементы в порядке
Это не относится к PriorityQueue
.Вы можете использовать SortedSet
, но для этого требуется, чтобы порядок сортировки был согласован с равенством, чего, как вы правильно заметили, вы не можете достичь.Насколько я знаю, в JDK нет Collection
, который бы сохранял свои элементы в отсортированном порядке для порядка сортировки, который считает некоторые элементы равными.Однако вы можете использовать массив или ArrayList
и отсортировать его вручную после изменений, используя Arrays.sort
или Collection.sort
.Если коллекция меняется редко, такой подход я бы выбрал.Если оно часто меняется, вам придется выйти за рамки JDK или реализовать структуру данных самостоятельно.
poll()
возвращает элементы в отсортированном порядке
Для этого подходит очередь с приоритетами.A PriorityQueue
не требует, чтобы Comparator
(или реализация Comparable
) соответствовали равным;его JavaDoc четко пишет:
head этой очереди является наименьшим элементом относительно указанного порядка.Если несколько элементов связаны для наименьшего значения, заголовок является одним из этих элементов - связи нарушаются произвольно.
Более того, реализация PriorityQueue
в JDK 6 использует equals
только для реализацииindexOf(E)
, contains(Object)
и remove(Object)
, которые никоим образом не используют компаратор.Так что на самом деле не существует способа, которым согласованность с равными могла бы иметь значение для этого Collection
.
Comparable vs. Comparator
Обратите внимание, что не имеет значения,реализовать Comparable или Comparator, если речь идет о соответствии с равными.Для SortedSet
, либо должен соответствовать равным, для PriorityQueue
, Collection.sort
или Arrays.sort
, ни то, ни другое не должно быть.
TreeSet
и согласованность с equals
Поднято из комментариев:
TreeSet
является SortedSet и явно заявляет, что полагается только на сравнение / сравнение.В нем четко сказано: «Поведение набора четко определено, даже если его порядок не соответствует уравнениям; он просто не соблюдает общий контракт интерфейса Set».
Если вы цитируете,Пожалуйста, укажите все соответствующие части.Полный абзац гласит:
Обратите внимание, что порядок, поддерживаемый набором (независимо от того, предоставляется ли явный компаратор), должен быть в соответствии с равным , если он предназначен для правильной реализацииSet
интерфейс.[...] Это так, потому что интерфейс Set
определен в терминах операции equals
, но экземпляр TreeSet
выполняет все сравнения элементов, используя свой метод compareTo
(или compare
), поэтому дваэлементы, которые считаются равными этим методом, с точки зрения множества равны.Поведение набора четко определено, даже если его порядок не совпадает с равенством;он просто не соблюдает общий контракт интерфейса Set
.
Так что да, он четко определен, но не выполняет то, что требует вопрос: если вы передадите TreeSet.add
Event
с той же отметкой времени, что и другая Event
в наборе, новый Event
будет считаться дубликатом и не будет добавлен, даже если Event
s не equal
.Вопрос задается о сортировке Collection
;что не должно исключать Events
, которые дублируют ключ сортировки, не так ли?