Распечатать список целых как матрицу - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть список из 9 целых чисел, и я хочу напечатать все элементы из списка в виде матрицы 3,3.И я должен избегать ненужных пробелов в конце каждой строки.Можно ли использовать String.Join?Благодарю.

Вот мой код:

int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();

int[][] matrix = new int[input[0]][];

for (int i = 0; i < input[0]; i++)
{
    int[] line = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();

    matrix[i] = line;
}

List<int> arr = new List<int>(9);
List<int> arr1 = new List<int>(9);

arr = Enumerable.Repeat(0, 9).ToList();

//for (int i = 0; i < 9 ; i++) sum[i%3, i/3] = 0;

for (int row = 0; row < input[0] - 2; row++)
{
    for (int col = 0; col < input[1] - 2; col++)
    {
        arr1.Add(matrix[row][col]);
        arr1.Add(matrix[row][col + 1]);
        arr1.Add(matrix[row][col + 2]);
        arr1.Add(matrix[row + 1][col]);
        arr1.Add(matrix[row + 1][col + 1]);
        arr1.Add(matrix[row + 1][col + 2]);
        arr1.Add(matrix[row + 2][col]);
        arr1.Add(matrix[row + 2][col + 1]);
        arr1.Add(matrix[row + 2][col + 2]);

        if (arr1.Sum() > arr.Sum())
        {
            arr = arr1.Select(a => a).ToList();
        }
        arr1.Clear();
    }
}

Console.WriteLine($"Sum = {arr.Sum()} ");

// print the list as a matrix

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Вам следует пересмотреть принятый ответ, потому что производительность со многими предметами плохая.

Возможно, это не имеет значения для текущего количества предметов, но все равно слышу мое предупреждение.

Я выполнил следующеефрагмент кода:

var sb = new StringBuilder();
for (int i = 0; i < asd.Count; i +=3)
    sb.AppendLine(string.Join(" ", asd.Skip(i).Take(3)));
Console.WriteLine(sb.ToString());

использовал StringBuilder для удаления времени, релевантного Console.WriteLine(); для каждого элемента в цикле.

Этот подход требует 756,115ms для завершения с 1 000 000 элементов.

Создайте список asd следующим образом:

var asd = Enumerable.Range(0, 1000000).ToList();

Все остальные ответы, приведенные до сих пор, будут работать лучше.

Причина, по которой принятое решение выполняет этоплохо из-за того, что .Skip() вызывается внутри цикла, он фактически не пропускает и не переходит непосредственно к этой позиции, а снова и снова перебирает список, пока не достигнет этой точки.

Мое решениебудет:

Console.WriteLine(string.Concat(asd.Select((x, i) => (i + 1) % 3 != 0 ? x + " " : x + Environment.NewLine)));

, который выполняет ту же задачу в 8,610ms

Для полноты:

  • Решение Войтека принимает: 7,932ms
  • Nirmal Subedi 'решениепринимает: 8,088ms

Примечание:

Изменено так, что он использует StringBuilder для построения строки и выводит строку только один раз на консоль вместо вызова Console.WriteLine() в цикле

Вот моя полная процедура тестирования:

var asd = Enumerable.Range(0, 1000000).ToList();

var sw1 = new Stopwatch();
sw1.Start();
Console.WriteLine(string.Concat(asd.Select((x, i) => (i + 1) % 3 != 0 ? x + " " : x + Environment.NewLine)));
sw1.Stop();

var sw2 = new Stopwatch();
sw2.Start();

var sb1 = new StringBuilder();
for (int i = 0; i < asd.Count; i += 3)
    sb1.AppendLine(string.Join(" ", asd.Skip(i).Take(3)));
Console.WriteLine(sb1.ToString());

sw2.Stop();

var sw3 = new Stopwatch();
sw3.Start();

var sb2 = new StringBuilder();
int counter = 0;
string output = "";
foreach (int value in asd)
{
    counter++;
    if (counter % 3 == 0)
    {
        output += value;
        sb2.AppendLine(output);
        output = string.Empty;
    }
    else
        output += value + " ";
}
Console.WriteLine(sb2.ToString());
sw3.Stop();

var sw4 = new Stopwatch();
sw4.Start();

var sb3 = new StringBuilder();
for (int i = 0; i <asd.Count / 3; i++)
{
    int index = i * 3;
    sb3.AppendFormat("{0} {1} {2}", asd[index], asd[index + 1], asd[index + 2]);
    sb3.AppendLine();
}
Console.WriteLine(sb3.ToString());
sw4.Stop();

Console.WriteLine("MySolution: " + sw1.ElapsedMilliseconds);
Console.WriteLine("Mong Zhu's Solution: " + sw2.ElapsedMilliseconds);
Console.WriteLine("Wojtek's Solution: " + sw3.ElapsedMilliseconds);
Console.WriteLine("Nirmal Subedi's Solution: " + sw4.ElapsedMilliseconds);

Console.ReadKey();
0 голосов
/ 13 ноября 2018

Теперь ваш код вставлен.Во всяком случае, я создал образец для печати матрицы 3х3.

class Program
{
    static void Main(string[] args)
    {
        StringBuilder stringBuilder = new StringBuilder();
        List<int> numbers = new List<int>() {1,2,3,4,5,6,7,8,9 };


        for (int i = 0; i <3; i++)
        {
            int index = i * 3;
            stringBuilder.AppendFormat("{0}{1}{2}", numbers[index], numbers[index + 1], numbers[index + 2]);
            stringBuilder.AppendLine();
        }

        Console.Write(stringBuilder.ToString());
        Console.ReadLine();
    }
}
0 голосов
/ 13 ноября 2018

Вот так я бы напечатал это, используя String.Join:

List<int> asd = new List<int> {1,2,3,4,5,6,7,8,9};

for (int i = 0; i < asd.Count; i +=3)
{
    Console.WriteLine(string.Join(" ",asd.Skip(i).Take(3)));
}

Объяснение: Пройдите шаги 3. Пропустите количество чисел, равное шагу, и возьмите 3, чтобы объединить строку матрицы.

0 голосов
/ 13 ноября 2018

Ты это имел ввиду?

    string output = string.Empty;
    List<int> myList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    int counter = 0;
    foreach (int value in myList)
    {
        output += value.ToString();
        counter++;
        if (counter % 3 == 0)
        {
            Console.WriteLine(output);
            output = string.Empty;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...