2011-08-11 28 views
18

Ok, ad esempio, ho un array come [[z, 1], [d, 3], [e, 2]], come posso ordinare questo array per il secondo elemento di ciascun array costituente? In modo che il mio array sarebbe simile al seguente? [[z, 1], [e, 2], [d, 3]]?Ordinamento di una matrice bidimensionale per il secondo valore

+2

noti che questo è davvero un array di array, non una matrice 2-dimensionale. – Phrogz

+0

possibile duplicato di [Ordinare una raccolta di oggetti per numero (prima il più alto) poi per lettera (in ordine alfabetico)] (http://stackoverflow.com/questions/2232470/sort-a-collection-of-objects-by-number- lettere maiuscole e minuscole) –

risposta

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

O come utente @Phrogz sottolinea, se le matrici interne hanno esattamente due elementi ciascuno:

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

o più semplicemente: 'arr.sort_by {| s, n | n} 'o anche' arr.sort_by (&: last) '(in Ruby 1.9). – Phrogz

+1

'arr.sort_by (&: last)' funziona anche in Ruby 1.8.7. –

+0

@Phrogz Preferisci "ordinamento" perché in ruby ​​2.4 (dal 2.0 in effetti o anche prima) 'sort_by' non esiste ma solo' sort_by! 'E il [doc] (https://ruby-doc.org/ core-2.4.0/Array.html # method-i-sort_by-21) dice che: _Il risultato non è garantito come stabile. Quando due chiavi sono uguali, l'ordine degli elementi corrispondenti è imprevedibile. Quindi per poter usare 'sort_by!' Devi avere le chiavi uniq. Quindi @maerics si prega di modificare il tuo post per dire che o rimuovere 'sort_by'. – noraj

0

Come maerics utente risposta fornisce Crescente sorting.This risposta è molto utile per me, grazie. Per Discendente classificare i uso -

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

È possibile salvare la chiamata "inversa" semplicemente facendo 'arr.sort {| a, b || b [1] <=> a [1]} '(notare l'ordine inverso degli operandi dell'operatore di confronto). – maerics

+1

hai un errore di battitura nel tuo codice, il codice corretto è 'arr.sort {| a, b | b [1] <=> a [1]} '. hai inserito un carattere di pipe troppo – Fred

Problemi correlati