我可以删除数组中的项目范围吗?

时间:2017-04-12 16:15:10

标签: arrays ruby nested

说我有一阵次:

bmRequestType

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

4 个答案:

答案 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:0009: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