175 votes

Convertir un tableau Java en Iterable

J'ai un Tableau de primitives, par exemple pour les int, int[] foo. Il pourrait être une petite taille, ou pas.

int foo[] = {1,2,3,4,5,6,7,8,9,0};

Quelle est la MEILLEURE façon de créer un objet iterable ?

Iterable<Integer> fooBar = Convert(foo);

Notes:

Veuillez ne pas répondre à l'aide de boucles (à moins que vous pouvez donner une bonne explication sur la façon dont le compilateur de faire quelque chose d'intelligent à ce sujet?)

Notez également que

int a[] = {1,2,3};
List<Integer> l = Arrays.asList(a);

Ne sera même pas compiler

Type mismatch: cannot convert from List<int[]> to List<Integer>

Vérifiez également Pourquoi un tableau ne peuvent être cédées à Itératif? avant de répondre.

Aussi, si vous utilisez une bibliothèque (par exemple, Goyave), veuillez expliquer pourquoi c'est le Meilleur. ( Parce que sa de Google n'est pas une réponse complète :P )

Durer, car il semble y avoir des devoirs à faire à ce sujet, évitez d'afficher homeworkish code.

141voto

fmucar Points 6937
 Integer foo[] = {1,2,3,4,5,6,7,8,9,0};

List<Integer> list = Arrays.asList(foo);
or
Iterable<Integer> iterable= Arrays.asList(foo);
 

Bien que vous ayez besoin du tableau Integer, pas du tableau int, pour que cela fonctionne.

Pour les primitifs utilisez Guava

 Iterable<Integer> fooBar = Ints.asList(foo);
 

     <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>15.0</version>
        <type>jar</type>
    </dependency>
 

50voto

juste mes 2 centimes:

 final int a[] = {1,2,3};

java.lang.Iterable<Integer> aIterable=new Iterable<Integer>() {

    public Iterator<Integer> iterator() {
       return new Iterator<Integer>() {
            private int pos=0;

            public boolean hasNext() {
               return a.length>pos;
            }

            public Integer next() {
               return a[pos++];
            }

            public void remove() {
                throw new UnsupportedOperationException("Cannot remove an element of an array.");
            }
        };
    }
};
 

20voto

BeeOnRope Points 3617

Goyave fournit la carte que vous souhaitez comme type Int.asList(). Il y a un équivalent pour chaque type primitif dans la classe associée, par exemple, Booleans pour boolean, etc.

int foo[] = {1,2,3,4,5,6,7,8,9,0};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
    System.out.println(i);
}

Les suggestions ci-dessus pour utiliser Arrays.asList ne fonctionnera pas, même si la compilation est parce que vous obtenez un Iterator<int[]> plutôt que d' Iterator<Integer>. Ce qui se passe, c'est que plutôt que de créer une liste soutenue par votre tableau, vous avez créé un 1-liste d'éléments de tableaux, contenant votre tableau.

8voto

mindas Points 14217

J'ai eu le même problème et l'ai résolu comme ceci:

 final YourType[] yourArray = ...;
return new Iterable<YourType>() {
  public Iterator<YourType> iterator() {
     return Iterators.forArray(yourArray);   // Iterators is a Google guava utility
  }
}
 

L'itérateur lui-même est un paresseux UnmodifiableIterator mais c'est exactement ce dont j'avais besoin.

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