2011-10-29 8 views

risposta

9
data = ["0", "1", "2", "3", "4", "5"] 

order = [3, 1, 2, 0, 4, 5] 

> order.map{|x| data[x]} 
=> ["3", "1", "2", "0", "4", "5"] 

Se non si è certi se gli indici sono corrette, si può fare questo:

> order.map{|x| data.fetch(x)}  # will raise an exception if index out of bounds 
=> ["3", "1", "2", "0", "4", "5"] 
+0

brillanti! Grazie! C'è un modo per farlo in linea? –

+4

Io uso questo approccio perché mi permette di usare 'fetch' che può generare un'eccezione se non funziona. –

+0

@AndrewGrimm grazie per il suggerimento! Ho finito per usare questo approccio, perché posso usare le eccezioni nel caso in cui un indice sia fuori limite. –

23

È possibile utilizzare il values_at metodo scritto per questo tipo di attività:

data = ['0','1','2','3','4','5'] 
order = [3,1,2,0,4,5] 

data.values_at *order 
# => ["3", "1", "2", "0", "4", "5"] 
+0

pulito! perché * è necessario di fronte all'ordine? –

+4

@ user985823 Poiché 'values_at' non accetta un array come argomento, ma un numero arbitrario di parametri. '*' Fa sì che ogni valore dell'array 'order' sia passato come parametro al metodo. – Phrogz

+0

@Phrogz grazie! –

5

Non come @ risposta di Jakub utilizzando Array#values_at (che direi dovrebbe essere la risposta accettata), ma qui ci sono alcune altre alternative di divertimento:

p data.sort_by.with_index{ |d,i| order[i] } 
p data.zip(order).sort_by(&:last).map(&:first) 
+0

se ho capito bene, il metodo di Jakub e Tilo funzionerà solo se i numeri in "ordine" corrispondono agli indici, mentre il secondo funzionerà per ogni "ordine". – craq

Problemi correlati