Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何按时间对哈希数组进行排序?_Ruby_Sorting_Time - Fatal编程技术网

Ruby 如何按时间对哈希数组进行排序?

Ruby 如何按时间对哈希数组进行排序?,ruby,sorting,time,Ruby,Sorting,Time,按时间对哈希数组排序的最佳方法是什么 [ {: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, :featu

按时间对哈希数组排序的最佳方法是什么

[
  {: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"}
]
因此,我希望它按时间排序(按降序排列),如:

时间是
String
s,所以我需要在之前将其转换为
Int
?或者有什么办法来分类吗?

这个怎么样

array.sort_by{|h| h[:time].scan(/[\d.]+/).map(&:to_f)}.reverse
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"}

您拥有的不是有效的Ruby表达式。是否将其转换为int?是否要忽略分数部分?你需要明确你的意图。正确的答案取决于这一点。我投票决定结束,因为你没有说清楚。很高兴知道这是你想要的。
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"}