Подтвердить что ты не робот

Как определить конец цикла (для каждого)?

Используя 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(:) в последнем индексе.

UPDATE

Моим промежуточным решением является назначение переменной int, которая будет содержать количество итераций. Затем проверьте, равна ли переменная длине str.length.

4b9b3361

Ответ 1

Один из вариантов заключается в том, чтобы написать собственную реализацию итератора, которая отображала в каждой точке свойства первого, последнего, индекса и значения.

Я сделал то же самое для .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();
        }
    }
}

Ответ 2

Два простых способа, которые несколько забавны, учитывая ваши аргументы в пользу использования цикла 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.