Как определить конец цикла (для каждого)? - PullRequest
19 голосов
/ 26 мая 2011

Используя 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.

Ответы [ 2 ]

25 голосов
/ 26 мая 2011

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

7 голосов
/ 26 мая 2011

Один из вариантов - написать собственную реализацию итератора, которая в каждой точке отображает свойства first, last, index и value.

Я сделал то же самое для .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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...