【发布时间】:2015-04-03 00:54:48
【问题描述】:
我有一个哈希数组
a = [
{start_time: 9am, end_time: 10am},
{start_time: 10am, end_time: 11am},
{start_time: 11am, end_time: 12am},
{start_time: 1pm, end_time: 2pm},
{start_time: 2pm, end_time: 3pm},
{start_time: 3pm, end_time: 4pm},
{start_time: 4pm, end_time: 5pm},
{start_time: 5pm, end_time: 6pm}
]
还有一组日期范围和优先级 - 1 是最高优先级
p = [
{start_time: 11am, end_time: 3pm, priority: 1},
{start_time: 2pm, end_time: 5pm, priority: 2},
{start_time: 9am, end_time: 6m, priority: 3}
]
所以如果你把它应用到前一个数组
a = [
{start_time: 9am, end_time: 10am}, #has priority 3
{start_time: 10am, end_time: 11am}, #has priority 3
{start_time: 11am, end_time: 12am}, #has priority 3 & 1
{start_time: 1pm, end_time: 2pm}, #has priority 3 & 1
{start_time: 2pm, end_time: 3pm}, #has priority 3 & 2 & 1
{start_time: 3pm, end_time: 4pm}, #has priority 3 & 2
{start_time: 4pm, end_time: 5pm}, #has priority 3 & 2
{start_time: 5pm, end_time: 6pm} #has priority 3
]
我想根据优先级在每个范围内对数组进行切片。所以第 1 步将以优先级 1 对数组进行切片:
a = [
{start_time: 9am, end_time: 10am},
{start_time: 10am, end_time: 11am},
[{start_time: 11am, end_time: 12am}, #priority 1
{start_time: 1pm, end_time: 2pm}, #priority 1
{start_time: 2pm, end_time: 3pm}], #priority 1
{start_time: 3pm, end_time: 4pm},
{start_time: 4pm, end_time: 5pm},
{start_time: 5pm, end_time: 6pm}
]
优先级 2 不能在它的起点切分,因为它属于优先级 1。所以取最早的可用起点:
a = [
{start_time: 9am, end_time: 10am},
{start_time: 10am, end_time: 11am},
[{start_time: 11am, end_time: 12am}, #priority 1
{start_time: 1pm, end_time: 2pm}, #priority 1
{start_time: 2pm, end_time: 3pm}], #priority 1
[{start_time: 3pm, end_time: 4pm}, #priority 2
{start_time: 4pm, end_time: 5pm}], #priority 2
{start_time: 5pm, end_time: 6pm}
]
余数变为优先级 3,如果 start_time 与之前的 end_time 不匹配,我想拆分数组。所以我追求的最终结果是:
a = [
[{start_time: 9am, end_time: 10am}, #priority 3
{start_time: 10am, end_time: 11am}], #priority 3
[{start_time: 11am, end_time: 12am}], #priority 1 - note times aren't consecutive here
[{start_time: 1pm, end_time: 2pm}, #priority 1
{start_time: 2pm, end_time: 3pm}], #priority 1
[{start_time: 3pm, end_time: 4pm}, #priority 2
{start_time: 4pm, end_time: 5pm}], #priority 2
[{start_time: 5pm, end_time: 6pm}] #priority 3
]
我试图为此构建一个算法。它基本上按顺序遍历每个优先级,从范围中进行选择并将其移动到新数组中。
p_blocks = []
p.sort_by! { |x| x.[:priority] }
p.each do |block|
f = getReach(a, block[:start_time], block[:end_time])
f = x.slice_when { |x, y| x[:end_time] != y[:start_time]}.to_a if f.length > 0
p_blocks << f.flatten
a-f # remove from array
end
return p_blocks
def getReach(logs, start_time, end_time)
reach = logs.select { |time_log| # get all logs within range
((time_log[:start_time] < end_time and time_log[:start_time] > start_time) or
(time_log[:end_time] > start_time and time_log[:end_time] < end_time))
}.sort_by! { |x| x[:start_time] }
return reach
end
但是它不起作用,当我不需要时,我可能会将事情弄平,而且对于大型数据集可能会很慢。
如果您能提供任何帮助,那就太好了。
【问题讨论】:
-
Ryan,您需要退后一步,用语言说明您的最终目标是什么以及您选择采取的方法。现在你只是列出了一系列步骤,而没有告诉读者你要去哪里以及为什么。这有点像我告诉某人上车,开四个街区,左转,开六个街区,右转......,而不告诉他们他们的目的地或我选择那条特定路线的原因。
标签: ruby-on-rails ruby arrays