Как отсортировать смешанный массив по разным элементам в Ruby? - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть массив, подобный этому:

a = [
  [0, {:a=>"31", :b=>"21"}],
  [1, {:a=>"32", :b=>"11"}],
  [1, {:a=>"25", :b=>"19"}],
  [0, {:a=>"12", :b=>"10"}]
]

И я хочу отсортировать его по первому элементу каждой строки или по различным элементам хэша (2-й элемент в строке).

Ответы [ 3 ]

7 голосов
/ 17 ноября 2011

для сортировки по первому элементу в массиве:

> a.sort_by{|x| x.first}
 => [[0, {:a=>"31", :b=>"21"}], 
     [0, {:a=>"12", :b=>"10"}], 
     [1, {:a=>"32", :b=>"11"}], 
     [1, {:a=>"25", :b=>"19"}]] 

для сортировки по первому элементу в хэше:

> a.sort_by{|x| x.last.first}
 => [[0, {:a=>"12", :b=>"10"}],
     [1, {:a=>"25", :b=>"19"}], 
     [0, {:a=>"31", :b=>"21"}], 
     [1, {:a=>"32", :b=>"11"}]] 

или вы можете отсортировать по заданному ключу хеша:

> sort_key = :b
> a.sort_by{|x| x.last[ sort_key ]}
 => [[0, {:a=>"12", :b=>"10"}],
     [1, {:a=>"32", :b=>"11"}],
     [1, {:a=>"25", :b=>"19"}],
     [0, {:a=>"31", :b=>"21"}]] 

Если вы хотите отсортировать по первому значению массива, а затем по первой записи в хэше, в качестве вторичного критерия поиска, ответ:

> a.sort_by{|x| [x.first, x.last.first]}
 => [[0, {:a=>"12", :b=>"10"}], 
     [0, {:a=>"31", :b=>"21"}], 
     [1, {:a=>"25", :b=>"19"}], 
     [1, {:a=>"32", :b=>"11"}]] 
1 голос
/ 17 ноября 2011
a = [
  [0, {:a=>"31", :b=>"21"}],
  [1, {:a=>"32", :b=>"11"}],
  [1, {:a=>"25", :b=>"19"}],
  [0, {:a=>"12", :b=>"10"}]
]
p a.sort_by{|el| [el.first, *el.last.values]}

Выход:

=> [[0, {:a=>"12", :b=>"10"}], 
    [0, {:a=>"31", :b=>"21"}], 
    [1, {:a=>"25", :b=>"19"}], 
    [1, {:a=>"32", :b=>"11"}]]
0 голосов
/ 18 ноября 2011

Ну, я нашел ответ на свой вопрос.Пожалуйста, сравните и прокомментируйте.

#sort by first item of each row (number)
a.sort{|x,y| x[0] <=> y[0]}

#sort by the first item in the hash
a.sort{|x,y| x[1][:a] <=> y[1][:a]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...