들쭉날쭉한 배열을 반복하는 방법은 무엇입니까?
-
09-06-2019 - |
문제
이것은 나를 며칠 동안 미치게 만들었습니다.다음은 왜 작동하지 않습니까?
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
또한, 배열이 이와 같이 보인다면 어떻게 될까요?
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
해결책
좋습니다. 실제로 필요한 것은 "가변 배열"입니다.이렇게 하면 "다양한 길이의 다른 배열을 포함하는 배열"을 가질 수 있습니다.
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
산출:
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
다른 팁
'2' 또는 '3' 차원이 없기 때문입니다..GetLength(y) 대신 .GetLength(1)이어야 합니다.
또한:VB.Net에서는 배열 선언이 약간 다르게 작동합니다.선언에 지정하는 아래 첨자는 C# 또는 C++처럼 생성된 항목 수가 아닌 마지막 인덱스입니다.그러나 배열은 VB6처럼 1 인덱스가 아닌 C# 또는 C++처럼 여전히 0 인덱스입니다.이는 다른 언어에서 VB.Net으로 이동하면 언어에 관계없이 배열 본능이 잘못될 수 있음을 의미합니다.VB.Net에서는 Dim arr(3,3) 정수로 실제로는 4x4 정렬.
arr.GetLength(y)
해야한다
arr.GetLength(1)
음, 다음과 같은 배열이 있다면 어떨까요?
{ {1, 2, 3},
{4, 5, 6, 7, 8, 9, 9, 9},
{5, 4, 3, 2}
}
GetLength(1)은 여전히 각 행의 길이를 어떻게 알 수 있습니까?
기본적으로 제가 원하는 것은.... 주어진 행의 요소 수를 찾는 방법.
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
위의 코드는 저에게 효과적이었습니다.
편집하세요. 코드가 더러워진 것 같습니다.당신이 성취하려는 것이 무엇인지 궁금합니다.
C#으로 작성된 이 코드는 들쭉날쭉한 배열의 모든 항목 조합을 가져오는 것입니다.
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;
}
출력은 [0,0,0] = AAB [0,0,1] = AAD [0,0,2] = AAE [0,0,3] = AAF [0,1,0] = ABB [ABB [AAB [0,0,3] = AAB처럼 보입니다. 0,1,1] = ABD [0,1,2] = ABE [0,1,3] = ABF [1,0,0] = BAB [1,0,1] = 나쁜 [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
귀하의 선언: DIM arr(3,3) As Integer
allready는 주어진 행에 3개의 요소가 있음을 지정합니다(또는 4개, VB에 대해서는 잘 모르겠습니다).
다음을 시도해 볼 수 있습니다.
Dim arr(3) as Integer()
그러면 다음을 수행할 수 있습니다.
arr(n).Length
행 n의 길이를 구합니다.
나는 VB6에 약간 녹슬었고 VB.NET을 배운 적이 없지만 이것은 '들쭉날쭉한' 배열을 제공할 것입니다.다차원 배열에 대한 msdn 설명서를 확인하세요.