SCloudQ Ответов: 2

Как мне отобразить мой новый массив?


Всем привет,

Я работаю со строкой, состоящей из 2 строк с символами 1 и 0.
Я поместил строку в массив строк, чтобы извлечь строки.

В идеале я хотел бы перебрать этот массив и определить, является ли текущий элемент 1 или 0. если это 1, я хотел бы поместить символ '#' в другой массив типа char. если это 0, я хотел бы поместить "X", поэтому, когда я зацикливаю этот новый массив, я получаю аналогичный массив, но с новыми символами.

По какой-то причине мой массив символов не выводится на экран, не мог бы кто-нибудь указать мне правильное направление?

Что я уже пробовал:

class MainClass
    {
        const string maze = @"
            1 1 1 1 1
            1 0 0 0 1";
        
        public static void Main(string[] args)
        {
            //Display(GetMazeArray(maze));
            string[] lines = maze.Split(new char[] { '\n' },
                StringSplitOptions.RemoveEmptyEntries);

            char[][] characters = new char[2][];
            characters[0] = lines[0].ToCharArray();
            characters[1] = lines[1].ToCharArray();

            // new array to store the new characters
            char[][] newArr = new char[2][];

            for (int i = 0; i < 2; i++) 
            {
                for (int j = 0; j < 4; j++)
                {
                    if(characters[i][j] == '1')
                    {
                        newArr[i][j] = '#';
                    }
                    else if(characters[i][j] == '0')
                    {
                        newArr[i][j] = 'X';
                    }
                }
            }

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    Console.WriteLine(newArr[i][j]);
                }
            }
        }
}

2 Ответов

Рейтинг:
17

Thomas Daniels

В вашем текущем коде есть три проблемы:


  • newArr[0] и newArr[1] есть еще null потому что вы еще не назначили пустые массивы этим значениям. Сделать это:
    // new array to store the new characters
    char[][] newArr = new char[2][];
    newArr[0] = new char[characters[0].Length];
    newArr[1] = new char[characters[1].Length];
    

  • .ToCharArray() также даст вам кучу пробелов в вашем characters массив, который вам не нужен, потому что вы находитесь только около 0 и 1. Сначала удалите пробелы перед использованием ToCharArray:
    char[][] characters = new char[2][];
    characters[0] = lines[0].Replace(" ", "").ToCharArray();
    characters[1] = lines[1].Replace(" ", "").ToCharArray();
    

  • Вы используете j < 4 в ваших циклах for; но ваши массивы символов[i] имеют 5 элементов (последний индекс равен 4), поэтому вы хотите j <= 4 или j < 5.

Все эти проблемы решены:
using System;

class MainClass
    {
        const string maze = @"
            1 1 1 1 1
            1 0 0 0 1";
        
        public static void Main(string[] args)
        {
            //Display(GetMazeArray(maze));
            string[] lines = maze.Split(new char[] { '\n' },
                StringSplitOptions.RemoveEmptyEntries);

            char[][] characters = new char[2][];
            characters[0] = lines[0].Replace(" ", "").ToCharArray();
            characters[1] = lines[1].Replace(" ", "").ToCharArray();

            // new array to store the new characters
            char[][] newArr = new char[2][];
            newArr[0] = new char[characters[0].Length];
            newArr[1] = new char[characters[1].Length];

            for (int i = 0; i < 2; i++) 
            {
                for (int j = 0; j < 5; j++)
                {
                    if(characters[i][j] == '1')
                    {
                        newArr[i][j] = '#';
                    }
                    else if(characters[i][j] == '0')
                    {
                        newArr[i][j] = 'X';
                    }
                }
            }

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    Console.WriteLine(newArr[i][j]);
                }
            }
        }
}


Maciej Los

Обнаружение 3-х проблем заслуживает 5-ти!

BillWoodruff

+5

BillWoodruff

это можно немного упростить: см. код ниже

Рейтинг:
0

BillWoodruff

Вы можете уменьшить количество "создания строк и манипуляций с массивами" следующим образом:

private char[] splitary = new char[] {'\n','\r'};

// in some method:

StringBuilder sb = new StringBuilder(maze);
sb.Replace(" ", String.Empty);
sb.Replace('0', 'X');
sb.Replace('1', '#');

var trimmed = sb.ToString().Split(splitary, StringSplitOptions.RemoveEmptyEntries);

char[][] ary = new char[][]
{
    (trimmed[0].ToCharArray()),
    (trimmed[1].ToCharArray())
};
Но имейте в виду, что использование автоматического инициализатора массива означает, что вы не можете указать длину.


Thomas Daniels

5; я был очень сосредоточен на ошибках, но на самом деле это гораздо более элегантный способ решить всю проблему.