2017-04-12 56 views
0

说我有次一个数组:我可以删除数组中的项目范围吗?

daily_time_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'] ] 

有没有办法在这个数组中删除跨度。如果9点符合我的规范开始时间和11:00符合我的其他规范的结束时间,我可以删除嵌套数组从9点开始,嵌套数组以11点结束,所有嵌套数组在他们之间?

回答

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:0009:00之前正常化阵列中的现有条目重要检查条件:(rjust(5, '0')预先输入0以使条目太短)。

+0

从描述,我说你删除一个阵列太多。 –

+0

再次阅读这个问题我不确定他是否想用“11:00”保留或移除数组。如果他想保留它,只需更改范围以排除结尾 - 像这样('09:00'...'11:00')'(注意三个点)。 – spickermann

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"]] 
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"]] 

这是假设你的嵌套数组排序,您总是筛选的时间跨度时间相匹配(例如,如果您需要过滤“9:25”之间的一切,“11: 10“,那么这种方法将不起作用)

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