Wie iteriere ich ein gezacktes Array?
-
09-06-2019 - |
Frage
Das macht mich seit ein paar Tagen wahnsinnig.Warum funktioniert Folgendes nicht?
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
Und was wäre, wenn das Array stattdessen so aussehen würde?
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
Lösung
Ok, was Sie also wirklich brauchen, ist ein „gezacktes Array“.Dadurch erhalten Sie ein „Array, das andere Arrays unterschiedlicher Länge enthält“.
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
Ausgabe:
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
Andere Tipps
Weil es keine „2“- oder „3“-Dimension gibt.Sollte .GetLength(1) statt .GetLength(y) sein.
Auch:In VB.Net funktionieren Array-Deklarationen etwas anders.Der Index, den Sie in der Deklaration angeben, ist der letzte Index und nicht die Anzahl der erstellten Elemente wie bei C# oder C++.Aber das Array ist immer noch 0-indiziert wie C# oder C++, statt 1-indiziert wie VB6.Das heißt, wenn Sie von einer anderen Sprache zu VB.Net wechseln, sind Ihre Array-Instinkte wahrscheinlich falsch, egal um welche Sprache es sich handelt.In VB.Net, Dim arr(3,3) als Ganzzahl schafft tatsächlich eine 4x4 Array.
arr.GetLength(y)
sollte sein
arr.GetLength(1)
Was wäre, wenn ich ein Array hätte, das so aussieht?
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
Wie würde GetLength(1) trotzdem die Länge jeder Zeile kennen?
Im Grunde möchte ich Folgendes: eine Möglichkeit, die Anzahl der Elemente in einer bestimmten Zeile zu ermitteln.
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
Der obige Code hat bei mir funktioniert.
Bearbeiten, der Code fühlt sich allerdings schmutzig an.Ich frage mich, was Sie erreichen wollen?
Dieser Code in C# dient dazu, alle Kombinationen von Elementen in einem gezackten Array abzurufen:
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;
}
Die Ausgabe sieht aus wie [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] = schlecht [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
Ihre Erklärung: DIM arr(3,3) As Integer
Gibt bereits an, dass es in jeder Zeile 3 Elemente gibt (oder 4, bei VB bin ich mir nicht so sicher)
Du könntest es versuchen:
Dim arr(3) as Integer()
Sie sollten dann in der Lage sein:
arr(n).Length
Um die Länge der Zeile n zu ermitteln.
Ich bin mit VB6 etwas vertraut und habe VB.NET nie gelernt, aber das sollte ein „gezacktes“ Array ergeben.Schauen Sie sich die MSDN-Dokumentation zu mehrdimensionalen Arrays an.