2013-06-28 2 views
0

Я хочу отсортировать фильмы в этом массиве по значению популярности. Как я могу это сделать?Сортировка верхнего уровня уровня следующего уровня - Ruby

[ 
    { 
    "id"=>1, 
    "popularity"=>7.77030797174916, 
    "title"=>"Another film", 
    }, 
    { 
    "id"=>2, 
    "popularity"=>2.7703074916, 
    "title"=>"A film", 
    }, 
    { 
    "id"=>3, 
    "popularity"=>9.77030797174916, 
    "title"=>"A third film", 
    } 
] 
+0

использование 'sort_by', а затем записать блок, который вытаскивает популярность –

ответ

0

Очевидно, мы должны использовать здесь Enumerable#sort_by.

a = [ 
    { 
    "id"=>1, 
    "popularity"=>7.77030797174916, 
    "title"=>"Another film", 
    }, 
    { 
    "id"=>2, 
    "popularity"=>2.7703074916, 
    "title"=>"A film", 
    }, 
    { 
    "id"=>3, 
    "popularity"=>9.77030797174916, 
    "title"=>"A third film", 
    } 
] 
a.sort_by{|h| h["popularity"]} 
# => [{"id"=>2, "popularity"=>2.7703074916, "title"=>"A film"}, 
#  {"id"=>1, "popularity"=>7.77030797174916, "title"=>"Another film"}, 
#  {"id"=>3, "popularity"=>9.77030797174916, "title"=>"A third film"}] 

Или я мог бы также использовать Enumerable#sort:

a = [ 
    { 
    "id"=>1, 
    "popularity"=>7.77030797174916, 
    "title"=>"Another film", 
    }, 
    { 
    "id"=>2, 
    "popularity"=>2.7703074916, 
    "title"=>"A film", 
    }, 
    { 
    "id"=>3, 
    "popularity"=>9.77030797174916, 
    "title"=>"A third film", 
    } 
] 
a.sort{|h1,h2| h1["popularity"] <=> h2["popularity"]} 
# => [{"id"=>2, "popularity"=>2.7703074916, "title"=>"A film"}, 
#  {"id"=>1, "popularity"=>7.77030797174916, "title"=>"Another film"}, 
#  {"id"=>3, "popularity"=>9.77030797174916, "title"=>"A third film"}] 

ЭТАЛОН

require 'benchmark' 

a = [ 
    { 
    "id"=>1, 
    "popularity"=>7.77030797174916, 
    "title"=>"Another film", 
    }, 
    { 
    "id"=>2, 
    "popularity"=>2.7703074916, 
    "title"=>"A film", 
    }, 
    { 
    "id"=>3, 
    "popularity"=>9.77030797174916, 
    "title"=>"A third film", 
    } 
] 

Benchmark.bm(100) do |b| 
    b.report("Sort") { a.sort{|h1,h2| h1["popularity"] <=> h2["popularity"]} } 
    b.report("Sort by") { a.sort_by{|h| h["popularity"]} } 
end 

       user  system  total  real 
Sort   0.000000 0.000000 0.000000 ( 0.000041) 
Sort by  0.000000 0.000000 0.000000 ( 0.000019)