我有一个 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)
我有哪些选择?
迭代器解决方案:
你可能应该有这样的东西:
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)
评论中出现了有关该集更新的问题。迭代器会看到它吗?正常的答案取决于应用程序的要求。在这种情况下,我没有所有信息,我会尝试猜测。
在 jdk 1.5 之前,只有一种 SortedSet 实现( TreeSet )。这有一个快速失败迭代器。
在jdk 6中出现了一个新的实现:ConcurrentSkipListSet。此排序集的迭代器不是快速失败迭代器。
如果您要向集合中添加的元素比当前显示的元素“小”,那么您无论如何都无法通过“好”(不是快速失败)迭代器看到它。如果您添加的元素比当前显示的元素“更大”,您将通过适当的迭代器看到它。
最终的解决方案是在创建适当的更改时实际重置集合和迭代器。通过使用 ConcurrentSkipListSet 最初您只会看到“较大”的更改,而通过使用 TreeSet 您将在每次更新时失败。
如果您愿意错过比当前更新“更小的”更新,那么请使用 jdk 6.0 和 ConcurrentSkipListSet。如果没有,您将必须跟踪所显示的内容,并使用新项目和未显示的项目重建正确的集合。