From: x1 Date: 2005-12-24T09:16:49+09:00 Subject: Re: How to sort this hash? Simon!! That worked :-D *huge grin* If you don't mind me asking, have you had to use this before? I wouldnt consider myself a top notch developer but between the ruby docs and google searches, I would have never figured this out... Any tips out how you did? Just.. development experience? Thanks again!! On 12/23/05, x1 wrote: > Thank you for the reply. > > I tried adding your suggestions but ended up with an error: > >ruby array_test.rb > array_test.rb:19:in `[]': cannot convert String into Integer (TypeError) > from array_test.rb:19 > from array_test.rb:18:in `map' > from array_test.rb:18 > from array_test.rb:17:in `sort_by' > from array_test.rb:17:in `each' > from array_test.rb:17:in `sort_by' > from array_test.rb:17 > >Exit code: 1 > > > The script is: > > -------------------------------------- > > jobs = { > "2231" => {"command" => "test_a.bash", > "start_time" => "20051211", > "stop_time" => "20051222"}, > "1131" => {"command" => "test_b.bash", > "start_time" => "20051011", > "stop_time" => "20051122"}, > "231" => {"command" => "test_c.bash", > "start_time" => "20051215", > "stop_time" => "20051227"} > } > > sort_keys = ["start_time", "stop_time"] > jobs.sort_by do |job| > sort_keys.map do |key| > job[key] > end > end > > On 12/23/05, Florian Gro� wrote: > > x1 wrote: > > > > > Is it possible to sort the jobs hash below based on values such as > > > command, start_time and stop_time? > > > > > > Ideally, sort_by would be dynamically provided and I would output the > > > jobs entries based on the value defined for sort_by. > > > > > > sort_by = "start_time" #<---- I'd like to use something like this to > > > define which job is listed first > > > > > > jobs = { > > > "2231" => {"command" => "test_a.bash", > > > "start_time" => "20051211", > > > "stop_time" => "20051222"}, > > > "1131" => {"command" => "test_b.bash", > > > "start_time" => "20051011", > > > "stop_time" => "20051122"}, > > > "231" => {"command" => "test_c.bash", > > > "start_time" => "20051215", > > > "stop_time" => "20051227"} > > > } > > > > sort_keys = ["start_time", "stop_time"] > > jobs.sort_by do |job| > > sort_keys.map do |key| > > job[key] > > end > > end > > > > Note that this will only work as long as all sort_keys are present in > > every job. > > > > You might want to check the documentation for Enumerable#sort_by, but > > let me document the special thing in this case as well. > > > > sort_by's block can return multiple values as an Array. In that case it > > will first sort by the first value then by the second one and so on. > > This is used in the above sample where every job is sorted by the fields > > representing the sort_keys on that specific job. > > > > -- > > http://flgr.0x42.net/ > > > > > > >