字符数组转换为二维整数数组失败
Character Array Conversion to 2D integer array Failure
我似乎无法将字符数组转换为二维整数数组。具体如下:
我想将包含特定定界符的字符数组转换为多维数组,其中每行的结尾由字符数组中的定界符指定(我已经用不同的方法确保每个行具有相同的长度)。
该数组仅包含 0 和 1。
问题是在测试方法时,它(方法)似乎跳过了一行-读取第一行,下一行是0s,读取第三行,第四行是0s。
这些是方法(有问题的方法和测试方法):
/// <summary>
/// Converts a character array to 2D int array, where each character is a digit and only the digits of 1 and 0 are
/// allowed.
/// </summary>
/// <returns>The 2D int array.</returns>
/// <param name="charArray">Character array.</param>
/// <param name="delimiter">Delimiter.</param>
public int[,] ConvertCharArrayTo2DIntArray(char[] charArray, char delimiter){
int columnCounter = 0;
//count how many rows
while (charArray [columnCounter] != delimiter) {
columnCounter++;
}
//count how many lines taking into account the delimiter
int rows = charArray.Length/(columnCounter+1);
int[,] twoDimArray = new int[rows, columnCounter];
//count
int h = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columnCounter; j++) {
if (charArray [h] != '\n') {
twoDimArray [i, j] = (int)Char.GetNumericValue(charArray [h]);
//throw exception if the array contains numbers other than 1 or 0
if (twoDimArray [i, j] != 1 && twoDimArray [i, j] != 0)
throw new ArgumentException ();
h++;
} else {
h++;
break;
}
}
}
return twoDimArray;
}
这是测试方法:
[Test()]
public void TestConvertCharArrayTo2DIntArray(){
HelperClass hc = new HelperClass ();
int[,] twoDimArrayExpected = new int[,]{
{ 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0 } };
char[] charArray = new char[] {'0','1','0','1','1','\n','1','1','1','1','1','\n','0','1','1','1','0','\n','0','1','0','1','0','\n'};
int[,] twoDimArrayActual = hc.ConvertCharArrayTo2DIntArray (charArray, '\n');
for (int i = 0; i < twoDimArrayExpected.GetLength (0); i++) {
for (int j = 0; j < twoDimArrayExpected.GetLength (1); j++) {
Console.Write (twoDimArrayActual [i,j]);
//Commented out because it throws exceptions
//Assert.AreEqual(twoDimArrayExpected[i,j],
//twoDimArrayActual[i,j]);
if (j == twoDimArrayExpected.GetLength (1) - 1) {
Console.Write ("\n");
}
}
}
}
输出是这样的:
01011
00000
11111
00000
我可能只是被卡住了,但现在我真的想不通。
当内循环结束时,您位于分隔符上。这是您需要跳过增加控制变量 h
的字符定界符的地方
就像你现在做的那样,你增加了控制变量,然后你跳出了内循环。但是,仅删除 break 指令是行不通的,因为退出内部循环会增加外部循环的控制变量 i
,从而使每个偶数行都为空且未处理
您可以尝试使用
修复您的代码
int h = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columnCounter; j++)
{
twoDimArray[i, j] = (int)Char.GetNumericValue(charArray[h]);
//throw exception if the array contains numbers other than 1 or 0
if (twoDimArray[i, j] != 1 && twoDimArray[i, j] != 0)
throw new ArgumentException();
h++;
}
h++;
}
如果你使用列表对象就非常简单
List<List<int>> twoDimArrayExpected = new List<List<int>>() {
new List<int>() { 0, 1, 0, 1, 0 },
new List<int>(){ 0, 1, 0, 1, 0 },
new List<int>(){ 0, 1, 0, 1, 0 },
new List<int>(){ 0, 1, 0, 1, 0 } };
string resutls = string.Join("\n", twoDimArrayExpected.Select(x => string.Join("", x)));
我似乎无法将字符数组转换为二维整数数组。具体如下:
我想将包含特定定界符的字符数组转换为多维数组,其中每行的结尾由字符数组中的定界符指定(我已经用不同的方法确保每个行具有相同的长度)。
该数组仅包含 0 和 1。
问题是在测试方法时,它(方法)似乎跳过了一行-读取第一行,下一行是0s,读取第三行,第四行是0s。
这些是方法(有问题的方法和测试方法):
/// <summary>
/// Converts a character array to 2D int array, where each character is a digit and only the digits of 1 and 0 are
/// allowed.
/// </summary>
/// <returns>The 2D int array.</returns>
/// <param name="charArray">Character array.</param>
/// <param name="delimiter">Delimiter.</param>
public int[,] ConvertCharArrayTo2DIntArray(char[] charArray, char delimiter){
int columnCounter = 0;
//count how many rows
while (charArray [columnCounter] != delimiter) {
columnCounter++;
}
//count how many lines taking into account the delimiter
int rows = charArray.Length/(columnCounter+1);
int[,] twoDimArray = new int[rows, columnCounter];
//count
int h = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columnCounter; j++) {
if (charArray [h] != '\n') {
twoDimArray [i, j] = (int)Char.GetNumericValue(charArray [h]);
//throw exception if the array contains numbers other than 1 or 0
if (twoDimArray [i, j] != 1 && twoDimArray [i, j] != 0)
throw new ArgumentException ();
h++;
} else {
h++;
break;
}
}
}
return twoDimArray;
}
这是测试方法:
[Test()]
public void TestConvertCharArrayTo2DIntArray(){
HelperClass hc = new HelperClass ();
int[,] twoDimArrayExpected = new int[,]{
{ 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0 } };
char[] charArray = new char[] {'0','1','0','1','1','\n','1','1','1','1','1','\n','0','1','1','1','0','\n','0','1','0','1','0','\n'};
int[,] twoDimArrayActual = hc.ConvertCharArrayTo2DIntArray (charArray, '\n');
for (int i = 0; i < twoDimArrayExpected.GetLength (0); i++) {
for (int j = 0; j < twoDimArrayExpected.GetLength (1); j++) {
Console.Write (twoDimArrayActual [i,j]);
//Commented out because it throws exceptions
//Assert.AreEqual(twoDimArrayExpected[i,j],
//twoDimArrayActual[i,j]);
if (j == twoDimArrayExpected.GetLength (1) - 1) {
Console.Write ("\n");
}
}
}
}
输出是这样的:
01011
00000
11111
00000
我可能只是被卡住了,但现在我真的想不通。
当内循环结束时,您位于分隔符上。这是您需要跳过增加控制变量 h
就像你现在做的那样,你增加了控制变量,然后你跳出了内循环。但是,仅删除 break 指令是行不通的,因为退出内部循环会增加外部循环的控制变量 i
,从而使每个偶数行都为空且未处理
您可以尝试使用
修复您的代码int h = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columnCounter; j++)
{
twoDimArray[i, j] = (int)Char.GetNumericValue(charArray[h]);
//throw exception if the array contains numbers other than 1 or 0
if (twoDimArray[i, j] != 1 && twoDimArray[i, j] != 0)
throw new ArgumentException();
h++;
}
h++;
}
如果你使用列表对象就非常简单
List<List<int>> twoDimArrayExpected = new List<List<int>>() {
new List<int>() { 0, 1, 0, 1, 0 },
new List<int>(){ 0, 1, 0, 1, 0 },
new List<int>(){ 0, 1, 0, 1, 0 },
new List<int>(){ 0, 1, 0, 1, 0 } };
string resutls = string.Join("\n", twoDimArrayExpected.Select(x => string.Join("", x)));