5

我有一个 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

4 回答 4

3

而不是 Set 你应该传递迭代器,然后下一个消费者只需调用 next()

于 2010-05-27T20:54:55.223 回答
3

你不想在 上使用IteratorSortedSet

于 2010-05-27T20:56:05.023 回答
2

除非您使用SortedSet第三方库中的一些,否则您的集合也是一个NavigableSet(每个都SortedSetjava.util实现NavigableSet)。如果你可以让事件传回它刚刚完成的元素,那么NavigableSet有一个更高的方法,它将使下一个元素高于你传入的元素:

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

  if(next != null)
    launchWindow(next);
}
于 2010-05-27T21:00:04.910 回答
2

迭代器解决方案:

你可能应该有这样的东西:

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. 直到 jdk 1.5 只有一个 SortedSet 实现( TreeSet )。这有一个快速失败的迭代器。

  2. 在 jdk 6 中出现了一个新的实现:ConcurrentSkipListSet。这个排序集的迭代器不是一个快速失败的迭代器。

如果您将一个元素添加到集合中,该元素比当前显示的元素“小”,那么您将无法通过“好”(不是快速失败)迭代器看到它。如果您要添加一个比当前显示的元素“更大”的元素,您将通过适当的迭代器看到它。

最终的解决方案是在创建适当的更改时实际重置集合和迭代器。最初使用 ConcurrentSkipListSet 时,您只会看到“更大”的更改,而使用 TreeSet 时,您将在每次更新时失败。

如果您愿意错过比当前更新“更小”的更新,请选择 jdk 6.0 和 ConcurrentSkipListSet。如果不是这样,您将不得不跟踪您显示的内容并使用新项目和未显示的项目重建适当的集合。

于 2010-05-27T21:05:08.983 回答