2016-07-19 2 views
0

私はアプリケーションのダウンタイム計算をいくつか試みようとしています。私が持っているのは、アプリケーションのさまざまな部分がダウンしたときを示すハッシュの巨大な配列です。ハッシュには開始時刻と終了時刻が含まれます。問題は、これらのダウンタイムの一部が重複する可能性があることです。どのようにして、ハッシュの配列を調べ、重複する時間間隔を見つけることができますか?ルビー配列の時間間隔が重複しているのを見つけて平坦化する

times = [{"timefrom"=>1461693247, "timeto"=>1461693307}, 
     {"timefrom"=>1462363987, "timeto"=>1462364607}, 
     {"timefrom"=>1462364037, "timeto"=>1462366037}] 

したがって例えば、上記配列を指定し、times[1]及びtimes[2]重なり合います。だから理想的には私がしたいのは、彼らが1つの長い停電を形成するようにそれらをマージすることです。 I.

times[1] = { "timefrom" => times[1]["timefrom"], "timeto" => times[2]["timeto"] } 
+0

が2つの以上のタイムスライスが重複する可能性がありますか?入力は '' timefrom ''でソートされていますか?理論的には@mudasobwa @ – mudasobwa

+0

が重複する可能性があります。彼らはおそらく超可能かもしれない。そして、はい、 'timefrom'でソートしました – Zack

+1

ようこそスタックオーバーフロー。問題を解決するためのあなたの努力を見たいと思います。それがなければ、あなたにコードを書くように求めているようです。リンクされたページを含む「[ask]」をお読みください。 http://meta.stackoverflow.com/q/261592/128421も読むのが便利です。 –

答えて

1

私はtimesg(ハッシュ)はg["timefrom"]によって順序付けされている要素を理解しています。

def combine_times(times) 
    times[1..-1].each_with_object([times.first]) do |g,a| 
    if g["timefrom"] < a.last["timeto"] 
     a[-1]["timeto"] = [ a[-1]["timeto"], g["timeto"] ].max 
    else 
     a << g 
    end 
    end 
end 

times = [{"timefrom"=>1461693247, "timeto"=>1461693307}, 

     {"timefrom"=>1462363987, "timeto"=>1462364607}, 
     {"timefrom"=>1462364037, "timeto"=>1462366037}] 

ライン間隔はtimesの要素をグループ化する方法を示しています。

combine_times(times) 
    #=> [{"timefrom"=>1461693247, "timeto"=>1461693307}, (times[0]) 
    # {"timefrom"=>1462363987, "timeto"=>1462366037}] (combines times[1..2]) 

別の例:

times = [{"timefrom"=>10, "timeto"=>20}, 
     {"timefrom"=>12, "timeto"=>15}, 

     {"timefrom"=>22, "timeto"=>30}, 
     {"timefrom"=>28, "timeto"=>32}, 
     {"timefrom"=>29, "timeto"=>29}, 

     {"timefrom"=>32, "timeto"=>40}, 

     {"timefrom"=>42, "timeto"=>50}, 
     {"timefrom"=>43, "timeto"=>46}] 

combine_times(times) 
    #=> [{"timefrom"=>10, "timeto"=>20}, (combines times[0..1]) 
    # {"timefrom"=>22, "timeto"=>32}, (combines times[2..4]) 
    # {"timefrom"=>32, "timeto"=>40}, (times[5]) 
    # {"timefrom"=>42, "timeto"=>50}] (combines times[6..7]) 
+0

ニース!あなたのソリューションに続いて、私は作業していたPerlソリューションを改善することができました。 –

関連する問題