Как получить следующий элемент SortedSet? - PullRequest
3 голосов
/ 28 мая 2010

У меня есть SortedSet, содержащий мои заказанные данные.

Я использую метод .first(), чтобы вернуть первую запись и передать ее в другое окно.
Когда другое окно заканчивается, я получаю событие, вызываемое, и я хочу передать следующее из SortedSet в окно, так как перейти к следующему элементу?

launchWindow(this.set.first());

Тогда у меня есть это:

onActivityResult(...) {
 if (this.set.hasNext()) launchWindow(this.set.next());//hasNext/next doesn't exists in the current context for SortedSet
}

Какие варианты у меня есть?

Ответы [ 4 ]

3 голосов
/ 28 мая 2010

Разве вы не хотите использовать Iterator на SortedSet?

3 голосов
/ 28 мая 2010

Вместо Set вы должны передать Iterator, тогда следующий потребитель просто вызовет next ()

2 голосов
/ 28 мая 2010

Если вы не используете SortedSet из сторонней библиотеки, ваш набор также равен NavigableSet (каждый SortedSet в java.util также реализует NavigableSet). Если вы можете заставить событие передать элемент, над которым он только что закончил, NavigableSet имеет метод выше , который получит следующий элемент выше, чем тот, который вы передаете:

public void onActivityResult(Event event) {
  Element element = event.processedElement;
  Element next = set.higher(element);

  if(next != null)
    launchWindow(next);
}
1 голос
/ 28 мая 2010

Решение итератора:

Вероятно, у вас должно быть что-то вроде этого:

class WindowLauncherClass {

   SortedSet set = null;
   Iterator setIterator = null;

   public WindowLauncherClass(SortedSet set) {
      this.set = set; // or you can copy it if that's what you need.
   }

   protected void launchWindow(Object item) {
     // impl 
   }

   public void onActivityResult() {
      if ( setIterator != null && setIterator.hasNext() ) 
      {   
         launchWindow(setIterator.next());
      }
   }

   public void start() {
       setIterator = set.iterator();
       onActivityResult();
   }
}

В комментариях появился вопрос об обновлениях к набору. Увидит ли это итератор? Обычный ответ зависит от требований приложения. В этом случае у меня нет всей информации, и я постараюсь угадать.

  1. до версии 1.5 не было только одной реализации SortedSet (TreeSet). это был неудачный быстрый итератор.

  2. В jdk 6 появилась новая реализация: ConcurrentSkipListSet. Итератор для этого отсортированного набора не является быстродействующим.

Если вы добавляете в набор элемент, «меньший», чем отображаемый в данный момент элемент, вы все равно не сможете его увидеть с помощью «хорошего» (не быстрого сбоя) итератора. Если вы добавляете элемент «больше», чем текущий отображаемый элемент, вы увидите его с помощью правильного итератора.

Окончательное решение - сбросить набор и итератор при создании правильного изменения. Изначально используя ConcurrentSkipListSet, вы увидите только «большие» изменения, а при использовании TreeSet вы будете терпеть неудачу при каждом обновлении.

Если вы позволяете пропустить обновления «меньшего размера», чем текущие, тогда переходите на jdk 6.0 и ConcurrentSkipListSet. Если нет, то вам придется следить за тем, что вы отобразили, и восстановить правильный набор с новыми и неиспользованными предметами.

...