Я использую какой-то старый код, который использует TreeSet
для выполнения рода коллекций объектов. (альтернативы использованию TreeSet - хорошая рекомендация, но я не хочу менять это, в частности,).Определение итератора TreeSet не соответствует интерфейсу Iterator?
Класс имеет два метода iterator()
итератора()
Возвращает итератор над элементами в этом наборе в порядке возрастания.
и descendingIterator()
descendingIterator()
Возвращает итератор над элементами в этом наборе в порядке убывания.
Моя концепция интерфейса Iterator
, реализуемого в Collection
или в собственной реализации, является то, что вы не можете предположить, какие-либо конкретный заказ.
В уже реализованной реализации предполагается, что два вызова дают итератору правильное упорядочение. Результаты на данный момент хороши, я опасаюсь, что это ложное предположение, и поскольку оно нарушает принципы интерфейса Iterator
, оно может измениться в будущем.
У меня нет опыта работы с TreeSet
, и я не вижу обход методы опроса элементов на заказ. Есть ли способ сделать это или просто придерживаться Iterator
и надеяться на лучшее?
EDIT
Пример использования:
TreeSet<BeatDesc> beatsOrderedTS = new TreeSet<>(new Comparator<BeatDesc>() {
@Override
public int compare(BeatDesc lhs, BeatDesc rhs) {
return lhs.getTS() - rhs.getTS() < 0 ? -1 : 1;
}
});
BeatDesc latest = beatsOrderedTS.descendingIterator().next()
EDIT
{//block 1
Iterator<BeatDesc> itBeatDesc = beatsOrderedTS.descendingIterator();
}
{//block 2
for (BeatDesc beatDesc : itBeatDesc){
....
}
Итак, используя этот формат, вы создаете привязку между блок 1 и блок 2
Вам не нужно надеяться. Спецификация TreeSet.iterator() гарантирует, что он выполняет итерацию в порядке возрастания. Это правда, и всегда будет правдой. –
'TreeSet' - это отсортированный набор (уникальные элементы). Сортировка - это единственный гарантированный заказ. Ваш код не должен предполагать ничего другого. Что еще нужно, чтобы вы говорили, когда говорите, ** правильный порядок **? –
Чтобы 'TreeSet' был' Collection', он должен реализовать только методы, определенные в интерфейсе 'Collection'. В этом нет ничего плохого, добавляя дополнительную функциональность. Вы также можете посмотреть в «LinkedHashMap», который представляет собой еще одну упорядоченную коллекцию. –