¿Cómo iterar una matriz irregular?
-
09-06-2019 - |
Pregunta
Esto me tiene volviendo loco desde hace unos días.¿Por qué no funciona lo siguiente?
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
Además, ¿qué pasaría si la matriz se viera así?
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
Solución
Bien, entonces lo que realmente necesitas es una "matriz irregular".Esto le permitirá tener una "matriz que contiene otras matrices de diferentes longitudes".
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
Producción:
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
Otros consejos
Porque no existe una dimensión '2' o '3'.Debería ser .GetLength(1) en lugar de .GetLength(y)
También:en VB.Net, las declaraciones de matrices funcionan de manera un poco diferente.El subíndice que especifica en la declaración es el último índice, no la cantidad de elementos creados como con C# o C++.Pero la matriz todavía tiene un índice 0 como C# o C++, en lugar de un índice 1 como VB6.Eso significa que si pasa a VB.Net desde un idioma diferente, sus instintos de matriz probablemente estén equivocados, sin importar qué idioma sea.En VB.Net, Dim arr(3,3) como entero en realidad crea un 4x4 formación.
arr.GetLength(y)
debiera ser
arr.GetLength(1)
Bueno, ¿qué pasaría si tuviera una matriz que se viera así?
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
¿Cómo podría GetLength(1) saber la longitud de cada fila?
Básicamente lo que quiero es.... una forma de encontrar el número de elementos en cualquier fila dada.
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
El código anterior funcionó para mí.
Edite, aunque el código se siente sucio.Me pregunto ¿qué es lo que estás tratando de lograr?
Este código en C# es para obtener todas las combinaciones de elementos en una matriz irregular:
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 salida se ve como [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] = malo [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
Su declaración: DIM arr(3,3) As Integer
ya especifica que hay 3 elementos en cualquier fila determinada (o 4, no estoy tan seguro acerca de VB)
Tu podrías intentar:
Dim arr(3) as Integer()
Entonces deberías poder hacer:
arr(n).Length
Para encontrar la longitud de la fila n.
Estoy un poco oxidado con VB6 y nunca aprendí VB.NET, pero esto debería darte una matriz "irregular".Consulte la documentación de msdn sobre matrices multidimensionales.