Comment parcourir un tableau irrégulier ?
-
09-06-2019 - |
Question
Cela me rend fou depuis quelques jours.Pourquoi ce qui suit ne fonctionne-t-il pas ?
Dim arr(3, 3) As Integer For y As Integer = 0 To arr.GetLength(0) - 1 For x As Integer = 0 To arr.GetLength(y) - 1 arr(y, x) = y + x Next Next
Et si le tableau ressemblait à ceci ?
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
La solution
Ok, donc ce dont vous avez vraiment besoin, c'est d'un "tableau irrégulier".Cela vous permettra d'avoir un "tableau contenant d'autres tableaux de longueurs variables".
Dim arr As Integer()() = {New Integer() {1, 2, 3}, New Integer() {4, 5, 6, 7, 8, 9, 9, 9}, New Integer() {5, 4, 3, 2}}
For x = 0 To arr.GetUpperBound(0)
Console.WriteLine("Row " & x & " has " & arr(x).GetUpperBound(0) & " columns")
For y = 0 To arr(x).GetUpperBound(0)
Console.WriteLine("(" & x & "," & y & ") = " & arr(x)(y))
Next
Next
Sortir:
Row 0 has 2 columns
(0,0) = 1
(0,1) = 2
(0,2) = 3
Row 1 has 7 columns
(1,0) = 4
(1,1) = 5
(1,2) = 6
(1,3) = 7
(1,4) = 8
(1,5) = 9
(1,6) = 9
(1,7) = 9
Row 2 has 3 columns
(2,0) = 5
(2,1) = 4
(2,2) = 3
(2,3) = 2
Autres conseils
Parce qu’il n’y a pas de dimension « 2 » ou « 3 ».Doit être .GetLength(1) au lieu de .GetLength(y)
Aussi:dans les déclarations de tableau VB.Net fonctionnent un peu différemment.L'indice que vous spécifiez dans la déclaration est le dernier index, et non le nombre d'éléments créés comme avec C# ou C++.Mais le tableau est toujours indexé 0 comme C# ou C++, au lieu d'être indexé 1 comme VB6.Cela signifie que si vous passez à VB.Net à partir d'une langue différente, vos instincts de tableau sont probablement faux, quelle que soit la langue.Dans VB.Net, Dim arr(3,3) Comme entier crée en fait un 4x4 tableau.
arr.GetLength(y)
devrait être
arr.GetLength(1)
Et si j'avais un tableau qui ressemblait à ceci
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
Comment GetLength(1) connaîtrait-il toujours la longueur de chaque ligne ?
En gros, ce que je veux, c'est... un moyen de trouver le nombre d'éléments dans une ligne donnée.
Dim arr(3, 3) As Integer
Dim y As Integer
Dim x As Integer
For x = 0 To arr.Rank - 1
For y = 0 To arr.GetLength(x) - 2
arr(x, y) = x + y
Next
Next
Le code ci-dessus a fonctionné pour moi.
Edit, le code semble sale cependant.Je me demande qu'est-ce que vous essayez d'accomplir ?
Ce code en C# sert à obtenir toutes les combinaisons d'éléments dans un tableau irrégulier :
static void Main(string[] args)
{
bool exit = false;
int[] indices = new int[3] { 0, 0, 0 };
string[][] vectores = new string[3][];
vectores[0] = new string[] { "A", "B", "C" };
vectores[1] = new string[] { "A", "B" };
vectores[2] = new string[] { "B", "D", "E", "F" };
string[] item;
int[] tamaños = new int[3]{vectores[0].GetUpperBound(0),
vectores[1].GetUpperBound(0),
vectores[2].GetUpperBound(0)};
while (!exit)
{
item = new string[]{ vectores[0][indices[0]],
vectores[1][indices[1]],
vectores[2][indices[2]]};
Console.WriteLine("[{0},{1},{2}]={3}{4}{5}", indices[0], indices[1], indices[2], item[0], item[1], item[2]);
GetVector(tamaños, ref indices, ref exit);
}
Console.ReadKey();
}
public static void GetVector(int[] tamaños, ref int[] indices, ref bool exit)
{
for (int i = tamaños.GetUpperBound(0); i >= 0; i--)
{
if (tamaños[i] > indices[i])
{
indices[i]++;
break;
}
else
{
//ULTIMO ITEM EN EL ARRAY, VALIDAR LAS OTRAS DIMENSIONES SI YA ESTA EN EL ULTIMO ITEM
if (!ValidateIndexes(tamaños, indices))
indices[i] = 0;
else
{
exit = true;
break;
}
}
}
}
public static bool ValidateIndexes(int[] tamaños, int[] indices)
{
for (int i = 0; i < tamaños.Length; i++)
{
if (tamaños[i] != indices[i])
return false;
}
return true;
}
La sortie ressemble à [0,0,0] = aab [0,0,1] = aad [0,0,2] = aae [0,0,3] = aaf [0,1,0] = abb [ 0,1,1] = abd [0,1,2] = abe [0,1,3] = abf [1,0,0] = bab [1,0,1] = mauvais [1,0,2 ] = Bae [1,0,3] = baf [1,1,0] = bbb [1,1,1] = bbd [1,1,2] = bbe [1,1,3] = bbf [2 , 0,0] = CAB [2,0,1] = CAD [2,0,2] = CAE [2,0,3] = CAF [2,1,0] = CBB [2,1,1] = CBD [2,1,2] = CBE [2,1,3] = CBF
Votre déclaration : DIM arr(3,3) As Integer
spécifie déjà qu'il y a 3 éléments dans une ligne donnée (ou 4, je ne suis pas si sûr pour VB)
Tu pourrais essayer:
Dim arr(3) as Integer()
Vous devriez alors pouvoir faire :
arr(n).Length
Pour trouver la longueur de la ligne n.
Je suis un peu rouillé sur VB6 et je n'ai jamais appris VB.NET, mais cela devrait vous donner un tableau « irrégulier ».Consultez la documentation msdn sur les tableaux multidimensionnels.