Convertir Java Tableau pour objet iterable
J'ai un Tableau de primitives, par exemple pour les int, int[] foo. Il pourrait être une petite taille d'un, ou pas.
int foo[] = {1,2,3,4,5,6,7,8,9,0};
Quelle est la meilleure façon de créer une Iterable<Integer>
- il?
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?)
Également noter 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>
Également vérifier
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 😛 )
Durer, car il semble y avoir des devoirs à faire à ce sujet, évitez d'afficher homeworkish code.
- double possible de Itérateur pour tableau
- Les ajouter à une LinkedList puis il suffit de retourner l'itérateur de ce Jeu.
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin d'utiliser un
Integer
array (pas unint
array) pour que cela fonctionne.Pour les primitives, vous pouvez utiliser la goyave:
Pour Java8: (à partir de Jin Kwon réponse)
int
, pasInteger
2)List
est déjàIterable
de sorte que la troisième ligne est inutile.juste mes 2 cents:
Iterator<Character>
à partir d'unString
. La mise en œuvre de votre propreIterator
semble que la seule façon d'éviter inutilement une itération à travers toutes les valeurs à convertir le type d'objet pour le type primitif (via la Goyave estInts.asList()
par exemple), juste pour être en mesure d'obtenir unIterator
de laList
qui a été créé.Avec Java 8, vous pouvez le faire.
Goyave fournit la carte que vous voulez que Int.asList(). Il y a un équivalent pour chaque type primitif dans la classe associée, par exemple,
Booleans
pourboolean
, etc.Les suggestions ci-dessus à utiliser
Arrays.asList
ne fonctionne pas, même si la compilation est parce que vous obtenez unIterator<int[]>
plutôt queIterator<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.J'ai eu le même problème et résolu comme ceci:
L'itérateur lui-même est un paresseux
UnmodifiableIterator
mais c'est exactement ce dont j'avais besoin.Tout d'abord, je ne peux qu'approuver que
Arrays.asList(T...)
est clairement la meilleure solution pour les types Wrapper ou des tableaux avec des non-primtive les types de données. Cette méthode appelle un constructeur d'une simple private staticAbstractList
mise en œuvre dans leArrays
classe qui, fondamentalement, enregistre la donnée de référence tableau de champ et simule une liste en surchargeant les méthodes nécessaires.Si vous pouvez choisir entre un primtive type ou d'un type Wrapper pour votre tableau, je voudrais utiliser le Wrapper type pour de telles situations, mais bien sûr, il n'est pas toujours utile ou nécessaire.
Il n'y aurait que deux possibilités, vous pouvez:
1) Vous pouvez créer une classe avec une méthode statique pour chaque primitive de type de données array (
boolean, byte, short, int, long, char, float, double
retour d'unIterable<
WrapperType>
. Ces méthodes anonymes classes deIterator
(en plus deIterable
) qui sont autorisés à contenir la référence de la méthode comprenant l'argumentation (par exemple unint[]
) sur le terrain afin de mettre en œuvre les méthodes.-> Cette approche est performant et vous permet d'économiser de la mémoire (sauf pour la mémoire de la création de méthodes, même si, à l'aide de
Arrays.asList()
prendrait la mémoire de la même façon)2) comme les tableaux n'ont pas de méthodes (comme la lecture, sur le côté est lié) ils ne peuvent pas fournir une
Iterator
instance. Si vraiment vous êtes trop paresseux pour écrire de nouvelles classes, vous devez utiliser une instance d'une classe qui implémenteIterable
car il n'y a pas d'autre moyen que l'instanciation deIterable
ou un sous-type.La SEULE façon de créer une Collection existante dérivé de la mise en œuvre de
Iterable
est d'utiliser une boucle (sauf si vous utilisez anonyme classes comme décrit ci-dessus) ou vous instanciez unIterable
la mise en œuvre de la classe dont le constructeur permet une primtive de type array (parce queObject[]
n'autorise pas les matrices de type primitif éléments), mais pour autant que je sache, l'API Java n'est pas une classe comme ça.La raison pour que la boucle s'explique aisément:
pour chaque Collection vous avez besoin d'Objets et primtive les types de données ne sont pas des objets. Les objets sont beaucoup plus gros que le type primitif de sorte qu'ils ont besoin de données supplémentaires qui doivent être créés pour chaque élément de la primitive de type tableau. Cela signifie que si deux façons de trois (à l'aide de
Arrays.asList(T...)
ou à l'aide d'une Collection existante) nécessitent un agrégat d'objets, vous devez créer pour chaque primitive de la valeur de votreint[]
de la matrice de l'objet wrapper. La troisième voie serait d'utiliser le tableau comme est et de l'utiliser dans une classe anonyme que je pense qu'il est préférable en raison de la rapidité de la performance.Il y a aussi une troisième stratégie à l'aide d'un
Object
comme argument de la méthode où vous souhaitez utiliser le tableau ouIterable
et on aurait besoin de vérifications de type de comprendre à quel type de l'argument a, cependant je ne le recommande pas du tout comme vous avez généralement besoin à considérer que l'Objet n'a pas toujours le type et que vous avez besoin de séparer le code pour certains cas.En conclusion, c'est la faute de Java problématique Générique Type de système qui ne permet pas d'utiliser les types primitifs comme le type générique qui permettrait d'économiser beaucoup de code en utilisant simplement
Arrays.asList(T...)
. Si vous avez besoin de programme pour chaque type primitif tableau, vous avez besoin d', une telle méthode (qui, fondamentalement, ne fait aucune différence à la mémoire utilisée par un programme C++ qui permettrait de créer pour chaque type d'argument d'une autre méthode.Vous pouvez utiliser
IterableOf
de Cactoos:Ensuite, vous pouvez transformer en une liste à l'aide de
ListOf
:Ou simplement ceci:
Dans Java 8 ou version ultérieure,
Iterable
est une interface fonctionnelle renvoieIterator
.De sorte que vous pouvez le faire.
Alors que la même réponse a déjà été tri de posté, je pense que la raison de l'utilisation de la nouvelle PrimitiveIterator.OfInt n'était pas clair. Une bonne solution est d'utiliser Java 8 PrimitiveIterator puisqu'il est spécialisé pour la primitive int types (et évite les extra-boxing/unboxing de pénalité):
Ref: https://doc.bccnsoft.com/docs/jdk8u12-docs/api/java/util/PrimitiveIterator.OfInt.html
Dans java8 IntSteam cours d'eau peut être mis en boîte à flux d'Entiers.
Je pense que des questions de rendement en fonction de la taille de la matrice.