2011-10-29 14 views

Respuesta

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"] 

Si no está seguro de si los índices son correctos, se puede hacer esto:

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

brillantes! ¡Gracias! ¿Hay alguna manera de hacerlo en línea? –

+4

Uso este enfoque porque me permite usar 'fetch' que puede generar una excepción si no funciona. –

+0

@AndrewGrimm gracias por la sugerencia! Terminé usando este enfoque, porque puedo usar excepciones en caso de que un índice esté fuera de los límites. –

23

Puede utilizar el values_at método escrito para este tipo de tarea:

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

limpio! ¿por qué el * se necesita delante de la orden? –

+4

@ user985823 Porque 'values_at' no toma una matriz como su argumento, sino un número arbitrario de parámetros. El '*' hace que cada valor de la matriz 'order' se pase como un parámetro al método. – Phrogz

+0

@Phrogz gracias! –

5

No tan bueno como @ respuesta de Jakub usando Array#values_at (que yo diría debería ser la respuesta aceptada), pero aquí hay algunas otras alternativas divertidas:

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

si entiendo correctamente, el método de Jakub y Tilo solo funcionará si los números en 'orden' corresponden a los índices, mientras que el segundo funcionará para cualquier 'orden'. – craq

Cuestiones relacionadas