说我有一阵次:
bmRequestType
有没有办法删除此数组中的跨距。如果9:00符合我的规格开始时间,11:00匹配我的其他规格结束时间,我可以删除从9:00开始的嵌套数组,嵌套数组以11:00结束和所有嵌套数组在他们之间?
答案 0 :(得分:1)
我会从这样的事情开始:
daily_time_chunks.delete_if do |time_slot|
('09:00'..'11:00').cover?(time_slot.first.rjust(5, '0'))
end
#=> [["8:30","9:00"],["11:30","12:00"],["1:00","1:30"]]
因为这是基于字符串比较,所以规范化从9:00
到09:00
的输入时间并在检查条件之前规范化数组中的现有条目非常重要:( rjust(5, '0')
将0
添加到太短的条目中。
答案 1 :(得分:0)
这段代码有点冗长,但它应该比检查第一个或最后一个元素更强大。
它:
'11:30'
至690
)['8:30','9:00']
至510..540
)'9:00', '11:00'
的任何时间跨度。'9:00', '11:00'
的跨度。 ["8:30", "9:00"], ["11:00", "11:30"]
保留在数组中。def time_to_minutes(hhmm)
h, m = hhmm.split(':').map(&:to_i)
h * 60 + m
end
def to_minute_range(hhmm1, hhmm2)
(time_to_minutes(hhmm1)..time_to_minutes(hhmm2))
end
def strict_overlap?(range1, range2)
range1.min < range2.max && range2.min < range1.max
end
to_delete = to_minute_range('9:00', '11:00')
p daily_time_chunks.reject{|times| strict_overlap?(to_minute_range(*times), to_delete)}
# [["8:30", "9:00"], ["11:00", "11:30"], ["11:30", "12:00"], ["1:00", "1:30"]]
使用'8:55', '11:05'
,输出:
[["11:30", "12:00"], ["1:00", "1:30"]]
答案 2 :(得分:0)
您可以transpose
嵌套数组,找到开始和结束元素的索引,然后slice!
输出该范围内的所有内容。像这样:
def filter_out(chunks, start_time, end_time)
new_chunks = chunks.transpose
start_index, end_index = [start_time, end_time].map do |t|
new_chunks.shift.index(t)
end
chunks.slice!(start_index, end_index)
chunks
end
filter_out(daily_time_chunks, "9:00", "11:00")
#=> [["8:30", "9:00"], ["11:00", "11:30"], ["11:30", "12:00"], ["1:00", "1:30"]]
这假设您的嵌套数组已排序,并且您过滤的时间始终与跨度时间匹配(例如,如果您需要过滤&#34; 9:25&#34;和&#34; 11之间的所有内容) :10&#34;,然后这种方法不起作用)
答案 3 :(得分:0)
您可以在此处使用Ruby的flip-flop运算符。
chunks = [[ '8:30', '9:00'], [ '9:00', '9:30'], [ '9:30','10:00'], ['10:00','10:30'],
['10:30','11:00'], ['11:00','11:30'], ['11:30','12:00'], [ '1:00', '1:30']]
chunks.reject { |s,e| s=='9:00'..e=='11:00' ? true : false }
#=> [["8:30", "9:00"], ["11:00", "11:30"], ["11:30", "12:00"], ["1:00", "1:30"]]
注意一个人不能写
chunks.reject { |s,e| s=='9:00'..e=='11:00' }
#=> ArgumentError: bad value for range