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

时间:2010-05-27 20:51:57

标签: java sortedset

我有一个包含我的有序数据的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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您不想在Iterator上使用SortedSet吗?

答案 2 :(得分:2)

除非您使用第三方库中的某些SortedSet,否则您的设置也是NavigableSetSortedSet中的每java.util也会实现NavigableSet })。如果您可以将事件传回给刚完成的元素,NavigableSet有一个方法higher,它会使下一个元素高于您传入的元素:

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

  if(next != null)
    launchWindow(next);
}

答案 3 :(得分:1)

迭代器解决方案:

你应该有类似的东西:

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。此有序集的迭代器不是快速失败的迭代器。

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

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

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