Как получить даже группы в рубине? - PullRequest
0 голосов
/ 23 мая 2019

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

Я ищу метод, подобный objects.in_x_even_groups(4)

Ответы [ 4 ]

2 голосов
/ 23 мая 2019

Сгруппируйте ваши объекты по индексу по модулю количества групп.

objects.group_by.with_index { |_, i| i % num_groups }.values

Пример:

objects = %w{a b c d e f g h i j k}
objects.group_by.with_index { |_, i| i % 3 }.values
# [["a", "d", "g", "j"], ["b", "e", "h", "k"], ["c", "f", "i"]]

Это не будет дополнять группы меньшего размера нулями, а также будет чередовать ваши объекты. Так что это не сработает, если вам нужно, чтобы последовательные объекты были в одной группе.

1 голос
/ 23 мая 2019

Возможно, вы ищете метод in_groups.Из документов:

in_groups(number, fill_with = nil)

Разбивает или перебирает массив в number групп, дополняя все оставшиеся слоты fill_with, если только это не false.

%w(1 2 3 4 5 6 7 8 9 10).in_groups(3) {|group| p group}
["1", "2", "3", "4"]
["5", "6", "7", nil]
["8", "9", "10", nil]
0 голосов
/ 23 мая 2019

Я предполагаю:

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

l-s будет максимум 1.

def group_em(arr, ngroups)
  n_per_group, left_over = arr.size.divmod(ngroups)
  cum_off = 0
  ngroups.times.map do |i|
    n = n_per_group + (i < left_over ? 1 : 0)
    a = arr[cum_off, n]
    cum_off += n
    a     
  end
end

arr = [1, 2, 3, 4, 5, 6, 7]
(1..7).each { |m| puts "ngroups=#{m}: #{group_em(arr, m)}" }
ngroups=1: [[1, 2, 3, 4, 5, 6, 7]]
ngroups=2: [[1, 2, 3, 4], [5, 6, 7]]
ngroups=3: [[1, 2, 3], [4, 5], [6, 7]]
ngroups=4: [[1, 2], [3, 4], [5, 6], [7]]
ngroups=5: [[1, 2], [3, 4], [5], [6], [7]]
ngroups=6: [[1, 2], [3], [4], [5], [6], [7]]
ngroups=7: [[1], [2], [3], [4], [5], [6], [7]]
0 голосов
/ 23 мая 2019

Вы ищете in_groups_of:

https://apidock.com/rails/Array/in_groups_of

array = %w(1 2 3 4 5 6 7 8 9 10)
array.in_groups_of(3) {|group| p group}
=>
["1", "2", "3"]
["4", "5", "6"]
["7", "8", "9"]
["10", nil, nil]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...