使用for(int i = 0; i < str.length; i++)
我可以轻松检测到循环是否结束。
但我怎么知道我是否使用for
或for 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
的长度。
答案 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
}
}
实际上是同样的事情。请注意两个循环之间i
内if
的使用与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();
}
}
}