2016-01-21 7 views
0

Я использую какой-то старый код, который использует 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

+0

Вам не нужно надеяться. Спецификация TreeSet.iterator() гарантирует, что он выполняет итерацию в порядке возрастания. Это правда, и всегда будет правдой. –

+0

'TreeSet' - это отсортированный набор (уникальные элементы). Сортировка - это единственный гарантированный заказ. Ваш код не должен предполагать ничего другого. Что еще нужно, чтобы вы говорили, когда говорите, ** правильный порядок **? –

+0

Чтобы 'TreeSet' был' Collection', он должен реализовать только методы, определенные в интерфейсе 'Collection'. В этом нет ничего плохого, добавляя дополнительную функциональность. Вы также можете посмотреть в «LinkedHashMap», который представляет собой еще одну упорядоченную коллекцию. –

ответ

3

Я не знаю, откуда у вас возникла мысль, что «вы не можете принять какой-либо конкретный заказ» элементов, возвращаемых Iterator. Javadoc просто говорит:

Итератор над коллекцией.

Это не говорит ничего о заказе.

Теперь Javadoc из iterator() метода Collection говорит:

Возвращает итератор над элементами в этой коллекции. Нет гарантий относительно порядка возврата элементов (, если эта коллекция не является экземпляром какого-либо класса, который предоставляет гарантию).

Например, TreeSet, LinkedHashSet, EnumSet, и все List реализации сделать гарантию определенный порядок:

  • TreeSet - элементы упорядочены с использованием их естественного упорядочения, или компаратора, предоставленной в установить время создания, в зависимости от того, какой конструктор используется.
  • LinkedHashSet - Этот связанный список определяет порядок итераций, который является порядком, в котором элементы были вставлены в набор (порядок вставки).
  • EnumSet - Итератор, возвращаемый методом итератора, пересекает элементы в их естественном порядке (порядок, в котором объявлены константы перечисления).
  • List - Заказываемая коллекция (также известная как последовательность ). - iterator() возвращает итератор над элементами в этом списке в правильной последовательности.
+0

Как вы можете сказать, что эта коллекция является экземпляром некоторого класса, который предоставляет гарантию, отличную от логики или предположений? Я не утверждаю, что это неверно, но как вы можете получить ** гарантию ** последовательно, кроме как в коде каждой коллекции? –

+0

@RaduIonescu Гарантия находится в «договоре», как указано в документации, так же, как я перечислял выше, например. 'TreeSet' * явно * указывает порядок (естественный или' Компаратор'). – Andreas

+0

Благодарим вас за это объяснение. –

0

TreeSet предназначен для поддержания порядка (по возрастанию или по убыванию) элементов в соответствии с либо:

  • Объект, который вы собираетесь вставить в комплект реализации-х Comparable что-то вроде:

    class MyObject implements Comparable<MyObject> {.. 
    
  • при построении TreeSet где вы проходите вашу реализацию того, как вы хотите заказать элементы в наборе путем внедрения Comparator Inte rface что-то вроде:

    class MyComparator implements Comparator<MyObject> {.. 
    ... new TreeSet<>(new MyComparator()); 
    

Поэтому гарантировано вы получите элементы, чтобы в соответствии с вашей реализации этих интерфейсов.

+0

Я понимаю, как структура построена и поддерживается, но это не означает Я не мог хранить связанный список ссылок на объекты по мере их поступления и выводить итератор этого связанного списка или, возможно, иметь хэш-карту для быстрого доступа и возвращать итератор этого. –