2017-04-12 72 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