76 votes

Itérateur pour le tableau

Compte tenu de l'extrait de code suivant:

int[] arr = {1, 2, 3};
for (int i : arr)
    System.out.println(i);

J'ai les questions suivantes:

  1. Comment le ci-dessus pour chaque boucle de travail?
  2. Comment puis-je obtenir un itérateur sur un tableau en Java?
  3. Est la matrice converti à une liste pour obtenir l'itérateur?

55voto

uckelman Points 7228

Si vous souhaitez un Iterator sur un tableau, vous pouvez utiliser l'un de la une implémentation directe de sortir de là, au lieu de conditionnement de la matrice dans un List. Par exemple:

Apache Commons Collections ArrayIterator

Ou, si vous souhaitez utiliser des génériques:

com.Ostermiller.util.ArrayIterator

Notez que si vous voulez avoir un Iterator sur les types primitifs, vous ne pouvez pas, parce qu'un type primitif ne peut pas être un paramètre générique. E. g., si vous souhaitez un Iterator<int>, vous devez utiliser un Iterator<Integer> au lieu de cela, ce qui entraînera un grand nombre de l'autoboxing et -unboxing si c'est soutenu par un int[].

50voto

Péter Török Points 72981

Non, il n'y a pas de conversion. La JVM juste parcourt le tableau à l'aide d'un index à l'arrière-plan.

Citation de Efficace Java 2nd Ed., Article 46:

Notez qu'il n'y a pas de perte de performance pour l'aide la boucle for-each, même pour les tableaux. En fait, il peut offrir un léger avantage en termes de performances de plus ordinaire pour la boucle dans certaines circonstances, comme il calcule la limite de l'index du tableau qu'une seule fois.

Si vous ne pouvez pas obtenir un Iterator pour un tableau (sauf bien sûr en le convertissant en un List en premier).

33voto

Jochem Points 2399
Arrays.asList(arr).iterator();

Ou écrivez votre propre, la mise en œuvre de l'interface ListIterator..

31voto

30thh Points 1662

Google Goyave Libraries collection offre cette fonction:

Iterator<String> it = Iterators.forArray(array);

On devrait visez plutôt de Goyave sur l'Apache Collection (ce qui semble être abandonné).

10voto

Ashok D Points 739
public class ArrayIterator implements Iterator {
  private Object array[];
  private int pos = 0;

  public ArrayIterator(Object anArray[]) {
    array = anArray;
  }

  public boolean hasNext() {
    return pos < array.length;
  }

  public Object next() throws NoSuchElementException {
    if (hasNext())
      return array[pos++];
    else
      throw new NoSuchElementException();
  }

  public void remove() {
    throw new UnsupportedOperationException();
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X