2011-10-29 25 views

Trả lời

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

Nếu bạn không chắc chắn nếu các chỉ số là chính xác, bạn có thể làm điều này:

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

rực rỡ! cảm ơn! Có cách nào để thực hiện nội tuyến không? –

+4

Tôi sử dụng phương pháp này vì nó cho phép tôi sử dụng 'fetch' có thể tăng ngoại lệ nếu nó không hoạt động. –

+0

@AndrewGrimm cảm ơn về mẹo! Tôi đã kết thúc bằng cách sử dụng phương pháp này, bởi vì tôi có thể sử dụng ngoại lệ trong trường hợp một chỉ mục nằm ngoài giới hạn. –

23

Bạn có thể sử dụng values_at phương pháp được viết cho loại tác vụ này:

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

gọn gàng! tại sao * cần thiết trước lệnh? –

+4

@ user985823 Bởi vì 'values_at' không lấy một mảng làm đối số của nó, nhưng một số tham số tùy ý. '*' Làm cho mỗi giá trị của mảng 'thứ tự' được chuyển thành tham số cho phương thức. – Phrogz

+0

@Phrogz cảm ơn! –

5

Không tốt như @ câu trả lời Jakub bằng cách sử dụng Array#values_at (mà tôi sẽ tranh luận nên có câu trả lời được chấp nhận) nhưng đây là một số lựa chọn thay thế thú vị khác:

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

nếu tôi hiểu chính xác, phương thức của Jakub và Tilo sẽ chỉ hoạt động nếu các số trong 'thứ tự 'tương ứng với chỉ mục, trong khi số thứ hai của bạn sẽ hoạt động cho bất kỳ' thứ tự' nào. – craq

Các vấn đề liên quan