Comment détecter la fin de la boucle (pour chaque)?

en utilisant for(int i = 0; i < str.length; i++) je peux facilement détecter si la boucle est à la fin.

mais je ne peux pas savoir si j'utilise for ou for each.

for(String str : arrayString){

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

}

la raison pour laquelle j'utilise for(:) au lieu de for(;;) que str est en fait un grand objet dont j'ai besoin pour utiliser cette propriété pour une autre boucle à l'intérieur de cette boucle. Et je n'aime pas utiliser beaucoup object.get(index).getProperty C'est juste aussi pour la commodité de moi en faisant le codage. C'est pourquoi je veux savoir si le for(:) boucle est à la dernière index.

UPDATE

ma solution intérimaire est d'assigner un int variable qui retiendra le nombre d'itérations. Vérifiez ensuite si la variable est égale à la longueur du str.length.

18
demandé sur Peter Lang 2011-05-26 09:48:53

2 réponses

une option serait d'écrire votre propre implémentation iterator qui exposerait, à chaque point, les propriétés de first, last, index et value.

j'ai fait même chose pour .NET, et c'était loin d'être délicat. En Java, ce serait encore plus facile, car vous pourriez utiliser le hasNext() méthode de l'original itérateur pour déterminer si oui ou non c'est le dernier élément. Le code ressemblerait quelque chose comme ceci (complètement non testé):

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();
        }
    }
}
6
répondu Jon Skeet 2011-05-26 06:10:37

deux voies faciles, qui sont un peu amusantes compte tenu de votre raisonnement pour l'utilisation de la boucle foreach.

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

Ou

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

Effectivement la même chose. Il suffit de noter la différence entre l'utilisation de i dans le if entre les deux boucles et la valeur de départ de i.

23
répondu pickypg 2011-05-26 05:53:23