Ruby on rails Ruby中的高级分组

Ruby on rails Ruby中的高级分组,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想把事件按日期分组。 前奏: 一个事件包含8-10个以上的属性(不需要在示例中包括,但应考虑,这些属性在分组后仍应存在)。换句话说,事件对象不应仅按原样分组 考虑一个包含对象的数组: events = [ { :name => "event1", :days => [1,2,3,4,5] }, { :name => "event2", :days => [1,4,5] }, { :name => "eve

我想把事件按日期分组。 前奏:

一个事件包含8-10个以上的属性(不需要在示例中包括,但应考虑,这些属性在分组后仍应存在)。换句话说,事件对象不应仅按原样分组

考虑一个包含对象的数组:

events = [
  {
    :name => "event1",
    :days => [1,2,3,4,5]
  },
  {
    :name => "event2",
    :days => [1,4,5]
  },
  {
    :name => "event3",
    :days => [1]
  },
  {
    :name => "event4",
    :days => [2]
  },
  {
    :name => "event5",
    :days => [3]
  },
  {
    :name => "event6",
    :days => [4]
  },
  {
    :name => "event7",
    :days => [5]
  },
  {
    :name => "event8",
    :days => [1,2,3]
  },
  {
    :name => "event9",
    :days => [1,5]
  },
  {
    :name => "event10",
    :days => [1,2]
  },
  {
    :name => "event11",
    :days => [1,2,3,4,5]
  }
]
要分组,事件必须至少有3天。这几天应该按数字顺序排列。

示例(应分组):[1,2,3]

示例(不应分组):[1,4,5]

不适合分组的事件应放在它们包含的每一天。

示例:[1,4,5]应放在1,4和5中

上述事件数组的预期结果:

[
  {
    :heading => "1",
    :events => [
      {
        :name => "event3",
        :days => [1]
      },
      {
        :name => "event9",
        :days => [1,5]
      },
      {
        :name => "event10",
        :days => [1,2]
      },
      {
        :name => "event2",
        :days => [1,4,5]
      }
    ]
  },
  {
    :heading => "2", 
    :events => [
      {
        :name => "event4",
        :days => [2]
      },
      {
        :name => "event10",
        :days => [1,2]
      }
    ]
  },
  {
    :heading => "3",
    :events => [
      {
        :name => "event5",
        :days => [3]
      }
    ]
  },
  {
    :heading => "4",
    :events => [
      {
        :name => "event6",
        :days => [4]
      },
      {
        :name => "event2",
        :days => [1,4,5]
      }
    ]
  },
  {
    :heading => "5",
    :events => [
      {
        :name => "event7",
        :days => [5]
      },
      {
        :name => "event9",
        :days => [1,5]
      },
      {
        :name => "event2",
        :days => [1,4,5]
      }
    ]
  },
  {
    :heading => "1-3",
    :events => [
      {
        :name => "event8"
      }
    ]
  },
  {
    :heading => "1.5",
    :events => [
      {
        :name => "event1"
      },
      {
        :name => "event11"
      }
    ]
  }
]
这是非常先进的红宝石在这里。也许对我来说太高级了,我尝试过的每一件事最终都缺少了等式的一部分。但是,嘿,是鲁比,应该没那么难吧

编辑:更新了示例,并进行了澄清,更正了预期输出

要求“pp”
require 'pp'
pp(events.inject(Hash.new { |h, k| h[k] = [] }) do |m, e|
  days = e[:days]
  event = { :name => e[:name] }
  if days.size >= 3 && days.last - days.first + 1 == days.size
    m["%d-%d" % [days.first, days.last]] << event
  else
    days.each { |d| m[d.to_s] << event }
  end
  m
end)
pp(events.inject(Hash.new{h,k{h[k]=[]))do | m,e| 天=e[:天] 事件={:name=>e[:name]} 如果days.size>=3&&days.last-days.first+1==days.size m[%d-%d”%[days.first,days.last]
需要“pp”
pp(events.inject(Hash.new{h,k{h[k]=[]))do | m,e|
天=e[:天]
事件={:name=>e[:name]}
如果days.size>=3&&days.last-days.first+1==days.size

m[%d-%d”%[days.first,days.last]我会稍微修改DigitalRoss的答案。我会改变

    if days.size >= 3 && days.last - days.first + 1 == days.size

这将捕获[1,1,3,4]


在测试之前对days数组进行排序也是明智的!

我会稍微修改DigitalRoss的答案。我会改变

    if days.size >= 3 && days.last - days.first + 1 == days.size

这将捕获[1,1,3,4]


在测试之前对days数组进行排序也是明智的!

event8有三个连续的天,但它在输出中被分割了?根据您的规则,event8不应该在“1-3”中吗分组?关于
1,3,4,5
?它是否会有一个单独的
1
,然后是一组
3-5
?或者它不会对任何东西进行分组?是否可能有像
1,1,2,3
5,3,1
这样的日子?您期望的结果是多余的。您应该期望
{“1-5”=>[“event1”,“event11”],“1”=>[“event3”,“event8”…
。@tokland,@DigitalRoss是的,你是对的,event8应该在“1-3”中“小组,我错了。@阿玛丹,不,所有的日子都需要按数字顺序给我,它们不能包含重复的
1,1,2,3
@sawa,你是什么意思?event8有连续三天,但它在输出中是分开的?根据你的规则,event8不应该是“1-3”吗?”分组?关于
1,3,4,5
?它是否会有一个单独的
1
,然后是一组
3-5
?或者它不会对任何东西进行分组?是否可能有像
1,1,2,3
5,3,1
这样的日子?您期望的结果是多余的。您应该期望
{“1-5”=>[“event1”,“event11”],“1”=>[“event3”,“event8”,…
。@tokland,@DigitalRoss是的,你是对的,event8应该在“1-3”组中,我错了。@Amadan,不,所有的日子都需要按数字顺序告诉我,它们不能包含重复的
1,1,2,3
@sawa,你是什么意思?它有效!有办法让分组的事件最后一个吗?group
“1-3”“
应该在
“1-5”
等之前。更新的问题为您提供一个示例。当然,在1.8或1.9中,您可以将结果作为数组而不是散列获取,在1.9(散列对象保留其创建顺序)中,您可以将数组转换回散列。将结果放入
r
中,然后执行:
r.sort_by{k,v | k[2].to_i*10+k.to_i}
。和..在1.9中,你可以用Hash[r.sort_by{…}]
将其进行保序散列,如果days.size>=3&(days.min..days.max)。每个参数(days.size)。检测{f| f==(days.min..days.max.)
Thank you@DigitalRoss it works!我已经更新了我的问题,以反映我正在寻找的实现。我以为我可以自己解决其余的问题,但无法解决。对于给您带来的不便,我深表歉意。它起作用了!有没有办法让分组事件排在最后?分组
“1-3”
应该排在
“1-5”之前
等。更新了问题以给您一个例子。当然,在1.8或1.9中,您可以将结果作为数组而不是哈希,在1.9(哈希对象保留其创建顺序)中,您可以将数组转换回哈希。将结果放入
r
中,然后执行:
r.sort_by{k,v|k[2]。to_i*10+k.to_}
和..在1.9中,您可以使用
散列[r.sort_by{…}]
如果days.size>=3&&(days.min..days.max)。每个参数(days.size)。检测{f | f==(days.min..days.max.)
Thank you@DigitalRoss it works!我已经更新了我的问题,以反映我正在寻找的实现。我原以为我可以自己解决其余问题,但无法解决。对于给您带来的不便,我深表歉意。
    if days.size >= 3 && (days.first..days.last).to_a == days