Home > OS >  Reading string from a file to 2d array
Reading string from a file to 2d array

Time:04-18

i'm trying to convert a string from file to 2d array. Is it possible to make the array dynamic? And how can i return the array, so i can work with it? I'm really confused.

public interface IMazeLoader
{
    Maze LoadMaze(string src);
}

class MazeLoader : IMazeLoader
{
    public Maze LoadMaze(string filepath)
    {
        var width = 5;
        var height = 5;
        var map = new char[width, height];
        var file = new StreamReader(filepath);
        string line;
        var lineCount = 0;
        while ((line = file.ReadLine()) != null)
        {
            if (lineCount < height)
            {
                for (int i = 0; i < width && i < line.Length; i  )
                {
                    map[i, lineCount] = line[i];
                }
            }
            lineCount  ;
        }

        file.Close();

        return;
    }
}

Here is my Maze class :

public class Maze
    {
    public static readonly char CHAR_WALL = '#';
    public static readonly char CHAR_START = 'S';
    public static readonly char CHAR_FINISH = 'F';

    public int Width { get; internal set; }
    public int Height { get; internal set; }

    public int StartX { get; private set;}
    public int StartY { get; private set; }
    public int StartAngle { get; private set; }

    private char[,] _plan;

    public char[,] Plan { get { return _plan; } }

    public Maze(char[,] plan)
    {

    }

Thanks for any reply, happy Eastern btw. :)

CodePudding user response:

Something like this should allow you to load any rectangular dimension map:

public class MazeLoader : IMazeLoader
{
    public Maze LoadMaze(string filepath)
    {
        char[][] loaded =
            File
                .ReadLines(filepath)
                .Select(x => x.ToCharArray())
                .ToArray();
        
        int[] widths =
            loaded
                .Select(x => x.Length)
                .Distinct()
                .ToArray();
                
        if (widths.Length != 1)
        {
            throw new InvalidDataException("Map Data Not Rectangular");
        }
        else
        {
            var width = widths[0];
            var height = loaded.Length;
            var map = new char[height, width];

            for (int i = 0; i < height; i  )
                for (int j = 0; j < width; j  )
                    map[i, j] = loaded[i][j];

            return new Maze(map);
        }
    }
}

Now I tested this on this input:

aaaa
aaaa
bbbb
bbbb
bbbb

And got this map:

map

Please note that the file orientation and the map orientation are the same. I had to flip around how you were building our your map to get that to work.

Here's my alterations to Maze itself:

public class Maze
{
    public int Width => this.Plan.GetUpperBound(1) - this.Plan.GetLowerBound(1)   1;
    public int Height => this.Plan.GetUpperBound(0) - this.Plan.GetLowerBound(0)   1;

    public char[,] Plan { get; private set; }
    
    public Maze(char[,] plan)
    {
        this.Plan = plan;
    }
}
  • Related