добавление значений из текстового файла в 2-мерный массив int - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь добавить значения в двумерный массив int[,]

Текстовый файл ConnectedCaves содержит следующие данные

0,0,0,1, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0, 1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0

IМне нужно иметь его в следующем формате:

int[,] graph = new int[,] 
{
    { 0,0,0,1,0,0,0 },
    { 0,0,0,1,1,0,0 },
    { 0,0,0,0,1,1,1 },
    { 1,0,0,0,1,1,0 },
    { 0,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,0 },
    { 0,0,1,0,0,0,0 }
};

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

Можно ли добавить это, как это показано в текстовом файле, в двумерный массив?Если не напрямую, какой будет наилучший подход к получению этих данных в массив в формате, показанном в текстовом файле?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Используя Split , Trim и Выберите , вы можете легко получить List<int[]>.

var inputs =
@"{ 0,0,0,1,0,0,0 },
{ 0,0,0,1,1,0,0 },";

var lines = inputs.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

var dim =
    lines.Select(
        line =>
        line.Trim(new[] {'{', '}', ','})
            .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(element => int.Parse(element))
            .ToArray()
    ).ToList();

Тогда вы можете использовать ответ Джона в Как преобразовать список массивов в многомерный массив

static T[,] CreateRectangularArray<T>(IList<T[]> arrays)
{
    // TODO: Validation and special-casing for arrays.Count == 0
    int minorLength = arrays[0].Length;
    T[,] ret = new T[arrays.Count, minorLength];
    for (int i = 0; i < arrays.Count; i++)
    {
        var array = arrays[i];
        if (array.Length != minorLength)
        {
            throw new ArgumentException
                ("All arrays must be the same length");
        }
        for (int j = 0; j < minorLength; j++)
        {
            ret[i, j] = array[j];
        }
    }
    return ret;
}
0 голосов
/ 03 декабря 2018

Это почти Json :

Array definition

Из этого мы знаем, что окончательная структура вашей строки должна быть такой:

[
  [ 0,0,0,1,0,0,0 ],
  [ 0,0,0,1,1,0,0 ]
]

То есть простым заменить и использованием Json.net для десериализации json:

var inputs =
@"{ 0,0,0,1,0,0,0 },
{ 0,0,0,1,1,0,0 }";

var jsoned = String.Format("[{0}]", inputs.Replace('{', '[').Replace('}', ']'));
var result = JsonConvert.DeserializeObject<int[,]>(jsoned);
0 голосов
/ 03 декабря 2018

Вам потребуется код для:

  1. Разделить этот ввод на строки.
  2. Разделить каждую строку на ячейки, поля или отдельные значения
  3. Поместить эти значения вмассив

Шаг 1 + 2 можно выполнить с помощью REGEX, я полагаю.Если бы этих фигурных скобок не было, любой код синтаксического анализа CSV также мог бы справиться с этим.

Шаг 3, вероятно, потребует анализа.Как правило, вы не хотите использовать строки или символы в вашем коде.Это выглядит как целые, поэтому разберите их на целые и работайте с ними.

Что касается внутреннего массива: если вы не знаете, сколько будет строк - или даже сколько полей в строке - вам придетсяиспользуйте список или другую расширенную коллекцию.А для тех, кого вы можете использовать только зубчатый стиль, afaik.

...