ruby – 通过升序和降序排序多个值

前端之家收集整理的这篇文章主要介绍了ruby – 通过升序和降序排序多个值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图根据不同的属性来排序一组对象.其中一些属性我想按升序排序,一些按降序排列.我已经能够按升序或降序进行分类,但无法将这两者结合起来.

这是我正在使用的简单课程:

  1. class Dog
  2. attr_reader :name,:gender
  3.  
  4. DOGS = []
  5.  
  6. def initialize(name,gender)
  7. @name = name
  8. @gender = gender
  9. DOGS << self
  10. end
  11.  
  12. def self.all
  13. DOGS
  14. end
  15.  
  16. def self.sort_all_by_gender_then_name
  17. self.all.sort_by { |d| [d.gender,d.name] }
  18. end
  19. end

然后我可以实例化一些狗,以便稍后进行排序.

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

然后我可以使用sort_all_by_gender_then_name方法.

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

它返回的数组包括女性首先,然后男性,所有按名称按升序排序.

但是,如果我想让性别下降,然后将其命名为升序,以便首先是男性,然后按升序排列.在这种情况下:

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

或者,如果我希望通过性别升序,但名称下降:

  1. => [@fluffy,@max]

排序数值时,可以预先添加 – 使其排序相反.但是,我一直无法找到一种方法来做到这一点.任何帮助或想法将不胜感激.谢谢.

解决方法

这是使用.sort而不是.sort_by执行此操作的一种方法
  1. dogs = [
  2. { name: "Rover",gender: "Male" },{ name: "Max",{ name: "Fluffy",gender: "Female" },{ name: "Cocoa",gender: "Female" }
  3. ]
  4.  
  5. # gender asc,name asc
  6. p(dogs.sort do |a,b|
  7. [a[:gender],a[:name]] <=> [b[:gender],b[:name]]
  8. end)
  9.  
  10. # gender desc,b|
  11. [b[:gender],a[:name]] <=> [a[:gender],b[:name]]
  12. end)
  13.  
  14. # gender asc,name desc
  15. p(dogs.sort do |a,b[:name]] <=> [b[:gender],a[:name]]
  16. end)

输出

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

基本上,这是做一些类似于否定数字(如你在问题中提到的),通过将属性交换到另一个元素,如果需要按降序排序.

猜你在找的Ruby相关文章