如何获取 SortedSet 的下一个元素?

Pen*_*m10 5 java sortedset

我有一个 SortedSet 保存我的有序数据。

我使用该.first()方法返回第一条记录,并将其传递给另一个窗口。
当另一个窗口完成时,我收到一个调用的事件,我想将下一个从 SortedSet 传递到窗口,那么如何移动到下一个元素?

launchWindow(this.set.first());
Run Code Online (Sandbox Code Playgroud)

然后我有这个:

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

我有哪些选择?

Mih*_*der 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

评论中出现了有关该集更新的问题。迭代器会看到它吗?正常的答案取决于应用程序的要求。在这种情况下,我没有所有信息,我会尝试猜测。

  1. 在 jdk 1.5 之前,只有一种 SortedSet 实现( TreeSet )。这有一个快速失败迭代器。

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

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

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

如果您愿意错过比当前更新“更小的”更新,那么请使用 jdk 6.0 和 ConcurrentSkipListSet。如果没有,您将必须跟踪所显示的内容,并使用新项目和未显示的项目重建正确的集合。