如何检测循环的结束(对于每个)?

时间:2011-05-26 05:48:54

标签: java for-loop

使用for(int i = 0; i < str.length; i++)我可以轻松检测到循环是否结束。

但我怎么知道我是否使用forfor each

for(String str : arrayString){

    if(End of for) //Do something if the end of the loop

}

我使用for(:)而不是for(;;)的原因是str实际上是一个大型对象,我需要将该属性用于该循环内的另一个循环。而且我不喜欢使用很多object.get(index).getProperty这也是为了方便我编写代码。这就是为什么我想知道for(:)循环是否在最后一个索引。

更新

我的临时解决方案是分配一个int变量,该变量将保存迭代次数。然后检查变量是否等于str.length的长度。

2 个答案:

答案 0 :(得分:25)

两种简单的方法,考虑到你使用foreach循环的原因,这有点有趣。

int i = 1;
for (String str : arrayString) {
    if (i++ == arrayString.length) {
        // end
    }
}

或者

for (int i = 0; i < arrayString.length; ++i) {
    String str = arrayString[i];
    if (i + 1 == arrayString.length) {
        // end
    }
}

实际上是同样的事情。请注意两个循环之间iif的使用与i的起始值之间的区别。

答案 1 :(得分:7)

一个选项是编写自己的迭代器实现,在每个点暴露第一个,最后一个,索引和值的属性。

我已经完成了same thing for .NET,这远非棘手。在Java中,它会更容易,因为您可以使用原始迭代器的hasNext()方法来确定它是否是最后一个元素。代码看起来像这样 (完全未经测试):

public SmartIterable<T> implements Iterable<SmartIterator<T>.Entry>
{
    private final Iterable<T> iterable;

    public SmartIterable(Iterable<T> iterable)
    {
        this.iterable = iterable;
    }

    public Iterator<T> iterator()
    {
        return new SmartIterator<T>(iterable.iterator());
    }
}

public SmartIterator<T> implements Iterator<SmartIterator<T>.Entry>
{
    private final Iterator<T> iterator;
    private int index = -1;

    SmartIterator(Iterator<T> iterator)
    {
        this.iterator = iterator;
    }

    public void remove()
    {
        // Could potentially just delegate
        throw new UnsupportedOperationException();
    }

    public boolean hasNext()
    {
        return iterator.hasNext();
    }

    public Entry next()
    {
        T nextValue = iterator.next();
        index++;
        return new Entry(nextValue, index);
    }

    public class Entry
    {
        private final int index;
        private final T value;

        private Entry(int index, T value)
        {
            this.index = index;
            this.value = value;
        }

        public T getValue()
        {
            return value;
        }

        public int getIndex()
        {
            return index;
        }

        public boolean isFirst()
        {
            return index == 0;
        }

        public boolean isLast()
        {
            // Call into containing instance
            return !hasNext();
        }
    }
}