Est-il possible de créer dynamiquement un tableau multidimensionnel en Java?
Supposons que nous avons le code Java:
Object arr = Array.newInstance(Array.class, 5);
Serait que de courir? Par ailleurs, si nous étions à essayer quelque chose comme cela:
Object arr1 = Array.newInstance(Array.class, 2);
Object arr2 = Array.newInstance(String.class, 4);
Object arr3 = Array.newInstance(String.class, 4);
Array.set(arr1, 0, arr2);
Array.set(arr1, 1, arr3);
Serait arr1 alors un tableau 2D équivalente à:
String[2][4] arr1;
Comment à ce sujet: que faire si nous ne connaissons pas les dimensions de ce tableau jusqu'à exécution?
Edit: si cette aide (je suis sur que ça ferait...) nous essayons d'analyser un tableau de inconnue dimensions à partir d'une Chaîne de la forme
[value1, value2, ...]
ou
[ [value11, value12, ...] [value21, value22, ...] ...]
Et ainsi de suite
Edit2: Dans le cas où quelqu'un d'aussi stupide que je suis tente cette ordure, voici une version au moins compile et s'exécute. Si oui ou non la logique est son est une autre question tout à fait...
Object arr1 = Array.newInstance(Object.class, x);
Object arr11 = Array.newInstance(Object.class, y);
Object arr12 = Array.newInstance(Object.class, y);
...
Object arr1x = Array.newInstance(Object.class, y);
Array.set(arr1, 0, arr11);
Array.set(arr1, 1, arr12);
...
Array.set(arr1, x-1, arr1x);
Et ainsi de suite. Il a juste à être un géant, un tableau imbriqué d'Objets
- c'est ce que les Collections sont pour...regarder ArrayList<String>
- Bon, point. Que faire si nous avons besoin d'avoir ceci dans un tableau natif de forme et non pas une liste de tableaux. Si c'est un multi-dimension ArrayList, sera toArray gérer les Listes imbriquées?
- Non, il vous donnera un tableau de ArrayLists.
- pour avoir une primitive array (
String[][]
) que vous utilisez : Liste.toArray méthode, voir ma réponse. - Viens de comprendre à partir de ceci que vous pouvez créer un
Object[]
tableau, qui peut contenir des tableaux, comme les tableaux sont des objets. Cela signifie que vous pouvez arbitrairement nid des tableaux sans explicite la Dimension de la matrice de frappe
Vous devez vous connecter pour publier un commentaire.
Il est possible de le faire en java. (Je suis un peu surpris, je dois dire.)
Avertissement; je ne veux plus jamais voir ce code n'importe où ailleurs que comme une réponse à cette question. Je vous encourage fortement à utiliser
List
s.Exemple De Sortie:
Array.newInstance
. Si tu n'avais pas mentionné que la méthode en question, j'avais sans doute dit que c'était impossible... Alors c'était un effort conjoint 😉new
surArray.newInstance
.java.util
peut faire le travail. Voir ma réponse. J'UV pour l'effort de toute façon.Les tableaux sont de type sécurisé en java qui s'applique à des tableaux simples et "multi-dimensionnelle" tableaux - c'est à dire des tableaux de tableaux.
Si la profondeur d'imbrication est variable au moment de l'exécution, alors le mieux que vous pouvez faire est d'utiliser un tableau qui correspond à la plus connue minimum profondeur d'imbrication (probablement 1.) Les éléments de ce tableau avec soit des éléments simples, ou si d'autres nidification est nécessaire, un autre tableau. Un Objet tableau[] vous permettra de faire cela, puisque les tableaux imbriqués sont eux aussi considérés comme des Objets, et ainsi de s'intégrer dans le système de type.
Si l'imbrication est complètement régulier, alors vous pouvez anticiper cette régularité et de créer une multimensional tableau, à l'aide
Array.newInstance(String.class, dimension1, dimension2, ...)
, Si la nidification est irrégulière, il vous sera préférable d'utiliser des listes imbriquées, qui permettent un "irréguliers" structure et dynamique de dimensionnement. Vous pouvez avoir un déchiquetées à la structure, à la expence des génériques. Les génériques ne peuvent pas être utilisés si la structure est découpée car certains éléments peuvent être de simples éléments alors que d'autres éléments peuvent encore être des listes imbriquées.De sorte que vous pouvez passer plusieurs dimensions à
Array.newInstance
, mais que les forces d'une longueur fixe pour chaque dimension. Si c'est OK, vous pouvez utiliser ceci:L'autre option serait de les construire à partir du bas, à l'aide de
getClass
sur le niveau précédent de tableau que les données d'entrée pour le niveau suivant. Le code suivant s'exécute et produit un tableau en escalier telle que définie par les nœuds:int[0]
au lieu dedimension[0]
) de la sortie des valeurs, et je reçois[[Ljava.lang.String;@3e25a5, [Ljava.lang.String;@19821f]
sortie, montrant un tableau de deux tableaux de chaînes de caractères. Chacun des deux sous-tableaux a été initialisé avec[null, null, null, null]
, comme prévu.Non, vous ne pouvez pas définir un
String[]
valeur comme ça. Vous exécutez dansOk, si vous n'êtes pas sûr des dimensions de la matrice, la méthode suivante ne fonctionnera pas. Toutefois, si vous connaissez les dimensions, ne pas utiliser de réflexion. Procédez de la manière suivante:
Vous pouvez créer dynamiquement des tableaux 2d beaucoup plus facile que cela.
Ce sera "dynamiquement" créer un
x
pary
tableau 2d.Je suis donc venu sur cette question avec un code pour extraire les coefficients d'un polynôme avec un nombre variable de variables. Ainsi, un utilisateur peut
voulez le coefficient de tableau pour un polynôme à deux variables
3 x^2 + 2 x y
ou il pourrait être l'un avec trois variables. Idéalement, vous voulez un multiple de la dimension de la matrice de laquelle l'utilisateur peut facilement interroger, donc peut être jeté à l'Integer[], Integer[][] etc.
Il utilise essentiellement la même technique que jdmichal réponse, à l'aide de la
Array.newInstance(obj.getClass(), size)
méthode. Pour un multi dimensions des tableaux obj peut être un tableau d'une dimension moins.Exemple de code avec créé aléatoirement les éléments
Efficace Java item # (je ne me souviens pas ) : Connaître et utiliser les bibliothèques.
Vous pouvez utiliser un
List
et l'utilisation de latoArray
méthode:Pour le convertir en un tableau, vous devez utiliser:
Le truc, c'est, à l'extérieur tableau est déclaré à tenir
String[]
( tableaux de chaîne ) qui à son tour peut être créé dynamiquement avec un autreList<String>
ou, si vous êtes l'analyse de chaînes avec laString.split
méthode.Démo
En se concentrant sur la dynamique de la création de la table et pas dans l'analyse, voici un exemple sur la façon dont cela fonctionne est utilisé en conjonction avec
String.split
Là. Maintenant, votre
result
est un deux dimensions de créer dynamiquement un tableau contenant :[[1], [2, 3], [4, 5, 6, 7], [8, 9, 10, 11, 12, 13]]
comme prévu.Voici un l'exécution complète de la démo, qui ajoute également plus de regexp pour le mélange, afin d'éliminer les espaces blancs.
Je vous laisse gérer les autres scénarios.