2015-09-15 2 views
0

У меня, похоже, проблема с преобразованием массива символов в массив целых чисел 2D. Специфика заключается в следующем:Преобразование символов в массив целых чисел 2D Ошибка

Я хочу преобразовать массив символов, содержащий конкретный разделитель, в многомерный массив, в котором конец каждой строки задается разделителем, находящимся внутри массива символов (я уже убедился в другой метод, что каждая строка имеет одинаковую длину).

Массив содержит только 0 и 1 сек.

Проблема заключается в том, что при тестировании метода кажется, что он (метод) пропускает строку - читает первую строку, следующая строка - 0, читает третью строку, четвертая - 0.

Эти методы (рассматриваемый метод и метод испытания):

/// <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"); 
       } 
      } 
     } 
    } 

Выход заключается в следующем:

I может быть просто застрял, но сейчас я действительно не могу понять это.

ответ

0

Когда внутренний контур заканчивается, вы располагаетесь на разделителе. Это то место, где вам нужно пропустить ограничитель символов, увеличивая управляющую переменную h

Как вы теперь делаете, вы увеличиваете управляющую переменную, но затем вы выходите из внутреннего цикла. Просто удаление instructon перерыва, однако, не работает, потому что выход из внутреннего цикла увеличивает переменную 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++; 
} 
0

Очень удобно, если вы используете объект списка

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)));​ 
Смежные вопросы