2011-08-11 18 views
18

Хорошо, скажем, у меня такой массив, как [[z, 1], [d, 3], [e, 2]], как я могу отсортировать этот массив по второму элемент каждой составляющей матрицы? Чтобы мой массив выглядел следующим образом? [[z, 1], [e, 2], [d, 3]]?Сортировка двумерного массива по второму значению

+2

Обратите внимание, что это на самом деле массив массивов, а не 2-мерный массив. – Phrogz

+0

Возможный дубликат [Сортировка коллекции объектов по числу (сначала по высоте), затем буквой (по алфавиту)] (http://stackoverflow.com/questions/2232470/sort-a-collection-of-objects-by-number- first-then-by-letter-alphabetic) –

ответ

33
arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]} 
# => [[:z, 1], [:e, 2], [:d, 3]] 

Или, как пользователь @Phrogz указывает, если внутренние массивы имеют ровно два элемента каждый:

arr.sort_by{|x,y|y} # => [[:z, 1], [:e, 2], [:d, 3]] 
arr.sort_by(&:last) # => [[:z, 1], [:e, 2], [:d, 3]] 
+12

Или проще: 'arr.sort_by {| s, n | n} 'или даже' arr.sort_by (&: last) '(в Ruby 1.9). – Phrogz

+1

'arr.sort_by (&: last)' работает в Ruby 1.8.7. –

+0

@Phrogz Предпочитаете 'sort', потому что в ruby ​​2.4 (начиная с 2.0 или даже раньше)' sort_by' не существует, а только 'sort_by!' И [doc] (https://ruby-doc.org/ core-2.4.0/Array.html # method-i-sort_by-21) говорит, что: _The результат не гарантируется как стабильный. Когда два ключа равны, порядок соответствующих элементов непредсказуем. Поэтому для использования 'sort_by!' У вас должны быть ключи uniq. Итак, @maerics, пожалуйста, отредактируйте свое сообщение, чтобы сказать это или удалить 'sort_by'. – noraj

0

Как пользователь maerics ответить обеспечивает по возрастанию sorting.This Ответ очень полезно для меня спасибо. Для сортировались я использую -

arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]}.reverse 
#=> [[:d, 3], [:e, 2], [:z, 1]] 
+0

Вы можете сохранить обратный вызов, просто сделав 'arr.sort {| a, b || b [1] <=> a [1]} '(обратите внимание на обратный порядок операндов оператора сравнения). – maerics

+1

у вас есть опечатка в вашем коде, правильный код 'arr.sort {| a, b | b [1] <=> a [1]} '. вы слишком много вставили символ трубы – Fred

Смежные вопросы