2013-06-27 22 views
0

什麼是按時間排序哈希的最佳方法?如何按時間排序哈希數組?

[ 
    {:scenario_name=>"Scenario: Two different numbers", :scenario_line=>5, :feature_file=>"multiplication.feature", :time=>"0m2.004s"}, 
    {:scenario_name=>"Scenario: Sum of many numbers", :scenario_line=>6, :feature_file=>"addition.feature", :time=>"0m22.031s"}, 
    {:scenario_name=>"Scenario: Regular numbers", :scenario_line=>5, :feature_file=>"division.feature", :time=>"0m3.004s"}, 
    {:scenario_name=>"Scenario: Subtract two different numbers", :scenario_line=>6, :feature_file=>"subtraction.feature", :time=>"0m3.004s"} 
] 

所以,我期待有它排序按時間(降序排列),如:

[ 
    {:scenario_name=>"Scenario: Sum of many numbers", :scenario_line=>6, :feature_file=>"addition.feature", **:time=>"0m22.031s**"}, 
    {:scenario_name=>"Scenario: Regular numbers", :scenario_line=>5, :feature_file=>"division.feature", **:time=>"0m3.004s**"}, 
    {:scenario_name=>"Scenario: Subtract two different numbers", :scenario_line=>6, :feature_file=>"subtraction.feature", **:time=>"0m3.004s**"}, 
    {:scenario_name=>"Scenario: Two different numbers", :scenario_line=>5, :feature_file=>"multiplication.feature", **:time=>"0m2.004s**"} 
] 

的時間String S,所以我需要之前將其轉換爲Int?或者有什麼方法可以對它進行分類?

+1

你有什麼是不正確的Ruby表達式。 – sawa

+0

將它轉換爲int?你想忽略小數部分嗎?你需要明確你的意圖。正確答案因此而異。由於你沒有說清楚,我投票結束。 – sawa

回答

2
array.sort_by{|h| h[:time].scan(/[\d.]+/).map(&:to_f)}.reverse 
+1

太棒了!這對我來說很好。謝謝sawa! – user2253130

+0

很高興知道這是你想要的。 – sawa

-1
arr = [ 
    {:scenario_name=>"Scenario: Two different numbers", :scenario_line=>5, :feature_file=>"multiplication.feature", :time=>"0m2.004s"}, 
    {:scenario_name=>"Scenario: Sum of many numbers", :scenario_line=>6, :feature_file=>"addition.feature", :time=>"0m22.031s"}, 
    {:scenario_name=>"Scenario: Regular numbers", :scenario_line=>5, :feature_file=>"division.feature", :time=>"0m3.004s"}, 
    {:scenario_name=>"Scenario: Subtract two different numbers", :scenario_line=>6, :feature_file=>"subtraction.feature", :time=>"0m3.004s"} 
] 

arr.sort_by{|i| i[:time].scan(/\d+/).map{|i| -i.to_i}} 
# => [{:scenario_name=>"Scenario: Sum of many numbers", 
#  :scenario_line=>6, 
#  :feature_file=>"addition.feature", 
#  :time=>"0m22.031s"}, 
#  {:scenario_name=>"Scenario: Subtract two different numbers", 
#  :scenario_line=>6, 
#  :feature_file=>"subtraction.feature", 
#  :time=>"0m3.004s"}, 
#  {:scenario_name=>"Scenario: Regular numbers", 
#  :scenario_line=>5, 
#  :feature_file=>"division.feature", 
#  :time=>"0m3.004s"}, 
#  {:scenario_name=>"Scenario: Two different numbers", 
#  :scenario_line=>5, 
#  :feature_file=>"multiplication.feature", 
#  :time=>"0m2.004s"}] 
0

這個怎麼樣?

ary = [ 
    {:scenario_name=>"Scenario: Two different numbers", :scenario_line=>5, :feature_file=>"multiplication.feature", :time=>"0m2.004s"}, 
    {:scenario_name=>"Scenario: Sum of many numbers", :scenario_line=>6, :feature_file=>"addition.feature", :time=>"0m22.031s"}, 
    {:scenario_name=>"Scenario: Regular numbers", :scenario_line=>5, :feature_file=>"division.feature", :time=>"0m3.004s"}, 
    {:scenario_name=>"Scenario: Subtract two different numbers", :scenario_line=>6, :feature_file=>"subtraction.feature", :time=>"0m3.004s"} 
] 

ary = ary.sort_by do |hash| 
    match = /(\d+)m([\d.]+)s/.match hash[:time] 
    -(match[1].to_f * 60 + match[2].to_f) 
end 

ary.each { |hash| p hash } 

輸出

{:scenario_name=>"Scenario: Sum of many numbers", :scenario_line=>6, :feature_file=>"addition.feature", :time=>"0m22.031s"} 
{:scenario_name=>"Scenario: Subtract two different numbers", :scenario_line=>6, :feature_file=>"subtraction.feature", :time=>"0m3.004s"} 
{:scenario_name=>"Scenario: Regular numbers", :scenario_line=>5, :feature_file=>"division.feature", :time=>"0m3.004s"} 
{:scenario_name=>"Scenario: Two different numbers", :scenario_line=>5, :feature_file=>"multiplication.feature", :time=>"0m2.004s"}