Массив Ruby - возвращает коллекцию дублированных и не дублированных объектов - PullRequest
1 голос
/ 30 июля 2011

У меня есть массив объектов Race со следующими атрибутами:

  • способ
  • race_period_id
  • track_id

Я хочу собрать эти объекты Race - где значения атрибутов way и track_id одинаковы - в новом массиве, названном множеством_кателей. (По сути, каждый дубликат объекта Race определяется определением way и track_id.) В другом массиве с именем singular_array я хочу собрать все те объекты Race, которые не являются дубликатами.

Например, давайте предположим, что у меня есть четыре объекта Race со следующими значениями атрибута:

race1:

  • way = 1
  • race_period_id = 20304
  • track_id = 94949

race2:

  • way = 2
  • race_period_id = 20888
  • track_id = 94949

race3

  • way = 1
  • race_period_id = 20899
  • track_id = 94949

race4

  • way = 1
  • race_period_id = 20888
  • track_id = 885858

Итак, у меня есть два «множественных» объекта: раса 1 и раса3. И два «единичных» объекта: race2 и race4.

Если бы у меня был метод с именем get_plural_and_singular_arrays (races_array) , какой алгоритм я бы использовал, чтобы вернуть множественный_аррай (содержащий только объекты расы 1 и расы 3) и singular_array (содержит только объекты race2 и race4)?

def get_plural_and_singular_arrays(races_array)
  # algorithm here

  return plural_array, singular_array
end

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Вы можете начать с использования group_by, а затем упорядочить результаты этого в одиночные и двойные числа:

list.group_by do |i|
  [ i.way, i.track_id ]
end.values.group_by do |list|
  list.length > 1
end

У вас должен быть хеш с ключами true и false для вашего кратногозаписи и отдельные записи соответственно.

0 голосов
/ 31 июля 2011

Это может сработать:

def get_plural_and_singular(races)
  grouped_races = races.group_by { |r| [r.way, r.track_id] }.values
  grouped_races.partition { |grp| grp.size > 1 }.map(&:flatten)
end
0 голосов
/ 30 июля 2011

Код:

def get_plural_and_singular_arrays(races_array)
  singular_array, plural_array = [], []
  # algorithm here 
  races_array.group_by { |race| [race.way, race.track_id] }.each do |key, values|
    if values.size == 1
      singular_array << values[0]
    else
      plural_array += values
    end
  end
  return plural_array, singular_array
end

Тест:

irb(main):025:0> Race = Struct.new(:way, :track_id)
=> Race
irb(main):026:0> r1 = Race.new(1, 2)
=> #<struct Race way=1, track_id=2>
irb(main):027:0> r2 = Race.new(1, 2)
=> #<struct Race way=1, track_id=2>
irb(main):028:0> r3 = Race.new(3, 4)
=> #<struct Race way=3, track_id=4>
irb(main):029:0> r4 = Race.new(3, 5)
=> #<struct Race way=3, track_id=5>
irb(main):030:0> get_plural_and_singular_arrays([r1, r2, r3, r4])
=> [[#<struct Race way=1, track_id=2>, #<struct Race way=1, track_id=2>], [#<str
uct Race way=3, track_id=4>, #<struct Race way=3, track_id=5>]]
irb(main):031:0>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...