Определение количества строк и количества элементов в строке - PullRequest
1 голос
/ 11 января 2012

Это не сложная проблема, но я по какой-то причине не могу придумать простой способ сделать это с помощью оператора модуля.В основном у меня есть коллекция из N элементов, и я хочу отобразить их в виде сетки.

Я могу отображать максимум 3 записи по горизонтали и бесконечно по вертикали;они не имеют фиксированной ширины ... Так что, если у меня есть 2 элемента, они отображаются так [1][2].Если у меня есть 4 предмета, они отображаются в стопке следующим образом:

[1][2]
[3][4]

Если у меня есть 5 предметов, это должно выглядеть так:

[ 1 ][ 2]
[3][4][5]

Семь предметов немного сложнее:

[ 1 ][ 2]
[ 3 ][ 4]
[5][6][7]

Это одна из тех вещей, где, если бы я спал на ней, это было бы мозгом мертвым, очевидным утром, но все, что я могу придумать, - это сложные циклы и переменные состояния.Должен быть более простой способ.

Я делаю это на C #, но сомневаюсь, что язык имеет значение.

Ответы [ 4 ]

3 голосов
/ 11 января 2012

Максимизируя количество строк, содержащих три элемента, вы можете минимизировать общее количество строк. Таким образом, шесть элементов будут сгруппированы в две строки по 3, а не в три строки по 2:

[1][2][3]
[4][5][6]

и десять элементов будут сгруппированы в два ряда по 2 и два ряда по 3, а не в пять рядов по 2:

[ 1 ][ 2 ]
[ 3 ][ 4 ]
[5][6][7 ]
[8][9][10]

Если вы хотите сначала строки с двумя элементами, то вы продолжаете снимать два элемента, пока оставшиеся элементы не будут делиться на 3. По мере прохождения цикла вам необходимо отслеживать количество оставшихся элементов с помощью индекса или этажерка.

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

//logic within loop iteration
if (remaining % 3 == 0) //take remaining in threes; break the loop
else if (remaining >= 4) //take two items, leaving two or more remaining
else //take remaining items, which will be two or three; break the loop

Если мы рассмотрим пример из 10 пунктов, процесс будет выглядеть следующим образом:

  1. 10 пунктов осталось. 10% 3! = 0. Поскольку 10> 4, возьмите два предмета.
  2. осталось 8 предметов. 8% 3! = 0. Поскольку 8> 4, возьмите два предмета.
  3. осталось 6 предметов. 6% 3 = 0. Возьмите эти 6 предметов группами по три.

Чтобы перейти к вашему примеру из 7 предметов:

  1. осталось 7 предметов. 7% 3! = 0. Так как 7> 4, возьмите два предмета.
  2. Осталось 5 предметов. 5% 3! = 0. Поскольку 5> 4, возьмите два предмета.
  3. осталось 3 предмета. 3% 3 = 0. Возьмите эти 3 предмета как группу.

А вот результат для 4 предметов:

  1. осталось 4 предмета. 4% 3! = 0. Поскольку осталось = 4, возьмите два предмета.
  2. осталось 2 предмета. 2% 3! = 0. 2 <4. Перейдите в другое состояние, возьмите оставшиеся предметы. </li>

Я думаю, это сработает. По крайней мере, в 12:30 утра кажется, что это должно сработать.

2 голосов
/ 11 января 2012
if ((list.Count % 2) == 0)
{
 //Display all as [][]
                  [][]
}
else
{
//Display all as    [][]
                    [][]
//Display last 3 as [][][]
}
1 голос
/ 11 января 2012

Как насчет псевдокода

if n mod 3 = 1
  first 2 rows have 2 items each (assuming n >= 4)
  all remaining rows have 3 items

else if n mod 3 = 2
  first row has 2 items
  all remaining rows have 3 items

else
  all rows have 3 items
1 голос
/ 11 января 2012

Итак, учитывая, что: а) цель состоит в том, чтобы минимизировать количество строк, б) в строке не может быть более 3 элементов, в) в строке должно быть 3 элемента, если это возможно, и d) у вас не может быть строки с одним предметом, если это не единственный предмет, я бы сказал, что алгоритм выглядит следующим образом:

  1. Если есть только один предмет, он будет один в своем ряду; сделано.
  2. Рассчитать «предварительное» количество строк, разделив количество элементов на 3.
  3. Если остаток (N% 3) равен 0, то во всех строках будет по 3 элемента.
  4. Если остаток равен 1, тогда будет дополнительная строка, а последние 2 строки будут содержать только 2 элемента.
  5. Если остаток равен 2, тогда будет дополнительная строка, и в ней будет только 2 элемента.

Этот алгоритм создаст немного другой формат, чем вы предполагали (строки из 3 элементов будут вверху, строки из 2 элементов будут внизу), но он удовлетворяет ограничениям. Если вам нужно, чтобы строки из 2 элементов были наверху, вы можете изменить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...