Java迭代器对Next()施加条件

时间:2012-06-27 07:44:28

标签: java iterator

我对Java中的迭代器有点困惑。如何使next()仅返回某些值?就像说我有一个10个元素的布尔数组,我只想返回那些真实的。我是否在next()方法中设置了一个条件来检查该条件并在满足条件时返回?或者在实际使用迭代器时检查条件并继续调用next()直到得到合适的值,然后使用该值?

同样,如果我有一个int数组,并且我想创建一个数组的字符串表示形式,其中每个元素用空格分隔,但我只想使用负数元素。如果我想用迭代器执行此操作,我是否在next()方法中检查否定元素并仅返回下一个否定的值,或者在我进行字符串表示时检查,并继续调用next( )直到我得到一个负值,然后将该值添加到字符串?

谢谢!

4 个答案:

答案 0 :(得分:12)

Normal Java iterators只是迭代集合的每个元素。因此,您必须在每次迭代时自己检查值。

您所写的内容可以使用FilterIterator中的Apache Commons Collections课程完成。

来自JavaDoc:

  

这个迭代器修饰底层迭代器,只允许通过那些匹配指定Predicate的元素。

这是一个让你入门的例子:

// Create a predicate class, like this:
class MyAwesomePredicate implements Predicate {

    @Override
    public boolean evaluate(Object object) {

        // If the condition is satisfied, return true.
        // Return false otherwise.

    }     
}

// and pass it to the FilterIterator:
Iterator<SomeClass> matchingObjects = 
    new FilterIterator(myCollection.iterator(), new MyAwesomePredicate());

// Now iterate the maching objects:
while (machingObjects.hasNext() {

    // do your stuff

}

更新:如果您愿意,还有来自Iterators#filter(Iterator<T>, Predicate<? super T>)Guava。与Apache Commons不同,它支持泛型,并且(可以说)更高的凉爽因子

答案 1 :(得分:1)

Iterator用于迭代集合,并将逐个返回每个元素。没有其他方法可以使用Iterator,因此请在迭代中进行检查或创建自己的特殊迭代器。

答案 2 :(得分:1)

迭代器的概念很简单:它隐藏(封装)遍历算法的实现到你的元素集合。 你调用next - 它获取集合中的下一个元素,由你来决定使用这个值。通过使用迭代器,您不依赖于集合的内部实现。 当然你可以创建自己的迭代器(它应该实现java.util.Iterator接口),但我相信你要求它不是必需的:) 希望这有帮助

答案 3 :(得分:1)

从技术上讲,两者都是可行的,所以这实际上是一个设计问题。如果您确定每次迭代该Iterable结构时都需要这个条件,那么请使用Iterator子类的next()方法中的条件,否则,最好在Iterator之外检查您的应用程序。 / p>

此外,next()方法中的测试可能会提高性能,因为您将在应用程序代码中迭代更少数量的元素。因此,如果性能是一个问题,也许这是一个好主意。