0

知りたいのですが、プロダクションスタジオやリリース日などのプロパティを持つ「映画」オブジェクトの配列があります。

最初に制作スタジオのランキングに基づいて、次に各映画の日付に基づいて、オブジェクトの配列を並べ替えたいと思います。

例えば:

studio_ratings = [Studio1, Studio2, Studio3, Studio4, Studio5]

array_of_objects = [Object1, Object2, Object3, Object4, Object5, Object6, Object7, Object8, Object9]

各オブジェクトには日付があるので、たとえば、そうすることができObject1.date_publishedますObject1.production_studio

4

1 に答える 1

1

それstudio_ratingsがスタジオのランク付けを希望する順序だと思います。その場合、次のようなことができます。

array_of_objects.sort_by {|obj| [studio_ratings.index(obj.production_studio), obj.date_published]}

しかし、これらをたくさん行っている場合、またはスタジオのリストが長い場合は、何度も繰り返すのではなく、ハッシュを作成する方がよいでしょう.index。例えば:

>> studio_rankings = ['Universal', 'Global', 'Local', 'Wolverine']
=> ["Universal", "Global", "Local", "Wolverine"]
>> class Film
>>   attr_accessor :studio, :date
>>   def initialize(studio, date)
>>     @studio = studio
>>     @date = date
>>   end
>> end
=> nil
>> films = [Film.new('Global', '2012-01-01'), Film.new('Universal', '2013-04-12'), Film.new('Global', '2011-10-10'), Film.new('Wolverine', '2008-01-01')]
=> [#<Film:0x101b101a0 @date="2012-01-01", @studio="Global">, #<Film:0x101b10128 @date="2013-04-12", @studio="Universal">, #<Film:0x101b100b0 @date="2011-10-10", @studio="Global">, #<Film:0x101b10038 @date="2008-01-01", @studio="Wolverine">]
>> films.sort_by {|f| [studio_rankings.index(f.studio), f.date]}
=> [#<Film:0x101b10128 @date="2013-04-12", @studio="Universal">, #<Film:0x101b100b0 @date="2011-10-10", @studio="Global">, #<Film:0x101b101a0 @date="2012-01-01", @studio="Global">, #<Film:0x101b10038 @date="2008-01-01", @studio="Wolverine">]
>> studio_index = {}
=> {}
>> studio_rankings.each_with_index {|studio, i| studio_index[studio] = i}
=> ["Universal", "Global", "Local", "Wolverine"]
>> studio_index
=> {"Local"=>2, "Wolverine"=>3, "Global"=>1, "Universal"=>0}
>> films.sort_by {|f| [studio_index[f.studio], f.date]}
=> [#<Film:0x101b10128 @date="2013-04-12", @studio="Universal">, #<Film:0x101b100b0 @date="2011-10-10", @studio="Global">, #<Film:0x101b101a0 @date="2012-01-01", @studio="Global">, #<Film:0x101b10038 @date="2008-01-01", @studio="Wolverine">]
于 2013-03-25T20:34:30.307 に答える