Ruby on rails Ruby中的高级分组
我想把事件按日期分组。 前奏: 一个事件包含8-10个以上的属性(不需要在示例中包括,但应考虑,这些属性在分组后仍应存在)。换句话说,事件对象不应仅按原样分组 考虑一个包含对象的数组: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
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