许多算法需要在集合非空的情况下迭代一组元素。
由于在迭代过程中可能会更改集合,因此通常需要从集合中取出一个元素,然后进行迭代,可能会向集合中添加或删除元素。以下是典型的Java代码:
Set<Integer> possibleFactors = Sets.newHashSet(2,3,4,5,6,7,8,100);
while (!possibleFactors.isEmpty()) {
int factor = possibleFactors.iterator().next();
for (int i=1;i<10;i++) possibleFactors.remove(i*factor);
}
编辑:根据评论的要求,我将给出一个更好的例子。我正在遍历用户选择的文件,并通过检查每个项目的权限来进行过滤。但是,作为一种优化,如果用户没有权限访问某个目录,则我将从该集合中删除其中的所有文件。
Set<Path> input = Sets.newHashSet(userSelectedPaths);
while (!input.isEmpty()) {
Path path = input.iterator.next();
input.remove(path);
if (!expensivePermissionCheck(path)) {
input.removeAll(path.getFiles());
} else {
processPath(path);
}
}
然而,循环中的第一行看起来有些奇怪。它创建了一个多余的
Iterable
对象,而我只想要从集合中获取任意一个元素,不关心顺序。
除了性能之外,它看起来有点奇怪,也不太易读。
是否有更好的替代方案?也许完全不同的结构?
编辑:也许更好的表述应该是“如何从集合中弹出任意元素?”
while (possibleFactors.iterator().hasNext())
替换while (!possibleFactors.isEmpty())
。 - Rajeev Sreedharaniterator().hasNext()
方法会返回 true,所以我看不出有什么区别。 - Elazar Leibovich