Sort_by Ruby, One Descending, One Ascending

I searched for an answer about this to no avail, there is a similar question, but the answer did not work in this situation, it is sorted by a numerical element. A similar question - This does not work. I'm trying to use ruby ​​sort_by to sort one item descending from another in ascending order. All I can find is one or the other.

Here is the code:

# Primary sort Last Name Descending, with ties broken by sorting Area of interest.
people = people.sort_by { |a| [ a.last_name, a.area_interest]}

Any guidance would certainly help.

Sample data:

input

  • Russell, Logic
  • Euler, graph theory
  • Galois, Abstract Algebra
  • Gauss, Number Theory
  • Turing, algorithms
  • Galois, Logic

Output

  • Turing, algorithms
  • Russell, Logic
  • Gauss, Number Theory
  • Galois, Abstract Algebra
  • Galois, Logic
  • Euler, graph theory
+4
source share
2 answers

Create your own class that inverts the result <=>(including Comparable).

, , .

:

class Descending
  include Comparable
  attr :obj

  def initialize(obj)
    @obj = obj
  end
  def <=>(other)
    return -(self.obj <=> other.obj)
  end
end

people = [
  {last_name: 'Russell', area_interest: 'Logic'},
  {last_name: 'Euler', area_interest: 'Graph Theory'},
  {last_name: 'Galois', area_interest: 'Abstract Algebra'},
  {last_name: 'Gauss', area_interest: 'Number Theory'},
  {last_name: 'Turing', area_interest: 'Algorithms'},
  {last_name: 'Galois', area_interest: 'Logic'},
]
puts people.sort_by {|person| [
  Descending.new(person[:last_name]),  # <---------
  person[:area_interest],
]}

:

{:last_name=>"Turing", :area_interest=>"Algorithms"}
{:last_name=>"Russell", :area_interest=>"Logic"}
{:last_name=>"Gauss", :area_interest=>"Number Theory"}
{:last_name=>"Galois", :area_interest=>"Abstract Algebra"}
{:last_name=>"Galois", :area_interest=>"Logic"}
{:last_name=>"Euler", :area_interest=>"Graph Theory"}

BTW, , , , -:

people.sort_by {|person| [-person.age, person.name] }
+4

:

a = [ ['Russell', 'Logic'],           ['Euler', 'Graph Theory'],
      ['Galois', 'Abstract Algebra'], ['Gauss', 'Number Theory'],
      ['Turing', 'Algorithms'],       ['Galois', 'Logic'] ]

a.sort { |(name1,field1),(name2,field2)|
  (name1 == name2) ? field1 <=> field2 : name2 <=> name1 }
#=> [ ["Turing", "Algorithms"],   ["Russell", "Logic"],
#     ["Gauss", "Number Theory"], ["Galois", "Abstract Algebra"],
#     ["Galois", "Logic"],        ["Euler", "Graph Theory"] ]

, , , , :

a = [ %w{a b c}, %w{b a d}, %w{a b d}, %w{b c a}, %w{a b c}, %w{b c b}]
  #=> [["a", "b", "c"], ["b", "a", "d"], ["a", "b", "d"],
  #    ["b", "c", "a"], ["a", "b", "c"], ["b", "c", "b"]] 

a.sort { |e,f| e.first == f.first ? e[1..-1] <=> f[1..-1] : f <=> e }
  #=> [["b", "a", "d"], ["b", "c", "a"], ["b", "c", "b"],
  #    ["a", "b", "c"], ["a", "b", "c"], ["a", "b", "d"]] 
+4

Source: https://habr.com/ru/post/1529593/


All Articles