13

さまざまな属性に基づいてオブジェクトの配列をソートしようとしています。昇順で並べ替えたい属性と、降順で並べ替えたい属性があります。昇順または降順で並べ替えることができましたが、2 つを組み合わせることができませんでした。

ここに私が取り組んでいる単純なクラスがあります:

class Dog
  attr_reader :name, :gender

  DOGS = []

  def initialize(name, gender)
    @name = name
    @gender = gender
    DOGS << self
  end

  def self.all
    DOGS
  end

  def self.sort_all_by_gender_then_name
    self.all.sort_by { |d| [d.gender, d.name] }
  end
end

その後、いくつかの犬をインスタンス化して、後で並べ替えることができます。

@rover = Dog.new("Rover", "Male")
@max = Dog.new("Max", "Male")
@fluffy = Dog.new("Fluffy", "Female")
@cocoa = Dog.new("Cocoa", "Female")

その後、sort_all_by_gender_then_name メソッドを使用できます。

Dog.sort_all_by_gender_then_name
=> [@cocoa, @fluffy, @max, @rover]

返される配列には、最初に女性が含まれ、次に男性が含まれ、すべて名前の昇順で並べ替えられます。

しかし、性別が降順で名前が昇順になるようにしたい場合はどうすればよいでしょうか。最初に男性になり、次に名前の昇順でソートされます。この場合:

=> [@max, @rover, @cocoa, @fluffy]

または、性別の昇順で名前の降順で表示したい場合:

=> [@fluffy, @cocoa, @rover, @max]

数値を並べ替えるときは、先頭に - を付けて逆順に並べ替えることができます。ただし、文字列でこれを行う方法を見つけることができませんでした。ヘルプやアイデアをいただければ幸いです。ありがとう。

4

2 に答える 2

20

.sortの代わりに使用する 1 つの方法を次に示します.sort_by

dogs = [
  { name: "Rover", gender: "Male" },
  { name: "Max", gender: "Male" },
  { name: "Fluffy", gender: "Female" },
  { name: "Cocoa", gender: "Female" }
]

# gender asc, name asc
p(dogs.sort do |a, b|
  [a[:gender], a[:name]] <=> [b[:gender], b[:name]]
end)

# gender desc, name asc
p(dogs.sort do |a, b|
  [b[:gender], a[:name]] <=> [a[:gender], b[:name]]
end)

# gender asc, name desc
p(dogs.sort do |a, b|
  [a[:gender], b[:name]] <=> [b[:gender], a[:name]]
end)

出力:

[{:name=>"Cocoa", :gender=>"Female"}, {:name=>"Fluffy", :gender=>"Female"}, {:name=>"Max", :gender=>"Male"}, {:name=>"Rover", :gender=>"Male"}]
[{:name=>"Max", :gender=>"Male"}, {:name=>"Rover", :gender=>"Male"}, {:name=>"Cocoa", :gender=>"Female"}, {:name=>"Fluffy", :gender=>"Female"}]
[{:name=>"Fluffy", :gender=>"Female"}, {:name=>"Cocoa", :gender=>"Female"}, {:name=>"Rover", :gender=>"Male"}, {:name=>"Max", :gender=>"Male"}]

基本的に、これは、降順でソートする必要がある場合にプロパティを他の要素に交換することにより、数値を否定するのと同様のことを行っています(質問で述べたように)。

于 2013-05-18T20:49:08.397 に答える