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

时间是Strings,所以我需要将它转换为Int之前吗?或者有什么办法可以排序?

4

3 回答 3

2
array.sort_by{|h| h[:time].scan(/[\d.]+/).map(&:to_f)}.reverse
于 2013-06-27T18:15:03.530 回答
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"}
于 2013-06-27T18:32:35.863 回答
-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"}]
于 2013-06-27T18:17:21.650 回答