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

ace*_*ace 20 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

}
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

pic*_*ypg 26

两种简单的方法,考虑到你使用foreach循环的推理,这有点有趣.

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

要么

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

实际上是同样的事情.只要注意使用之间的差异i中的if两个循环和起始值之间i.


Jon*_*eet 7

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

为.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ace:使用直接for循环会更有效,但可能不那么优雅.但是你通常应该更关心编写可维护的代码然后*测量*性能,而不是猜测你的瓶颈在哪里. (2认同)