2011-10-29 15 views
10

मेरे पास मूल्यों की एक सरणी है, और एक सरणी जो ऑर्डर निर्धारित करती है।मैं एक रूबी ऐरे को तुरंत ऑर्डर देने के लिए कैसे पुन: व्यवस्थित करूं?

मैं दिए गए क्रम में सरणी को तुरंत कैसे व्यवस्थित कर सकता हूं?

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

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

मैं चाहता हूँ:

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

उत्तर

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

आप यकीन है कि अगर सूचकांक सही हैं नहीं कर रहे हैं, तो आप ऐसा कर सकते हैं:

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

प्रतिभाशाली! धन्यवाद! क्या इनलाइन करने का कोई तरीका है? –

+4

मैं इस दृष्टिकोण का उपयोग करता हूं क्योंकि यह मुझे 'fetch' का उपयोग करने की अनुमति देता है जो अपवाद बढ़ा सकता है अगर यह काम नहीं करता है। –

+0

@AndrewGrimm टिप के लिए धन्यवाद! मैं इस दृष्टिकोण का उपयोग कर समाप्त हुआ, क्योंकि अगर सूचकांक सीमा से बाहर है तो मैं अपवादों का उपयोग कर सकता हूं। –

23

आप values_at उपयोग कर सकते हैं इस तरह के कार्य के लिए लिखित विधि:

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

साफ! * आदेश के सामने * क्यों आवश्यक है? –

+4

@ user985823 क्योंकि 'value_at' एक सरणी को इसके तर्क के रूप में नहीं लेता है, लेकिन पैरामीटर की मनमानी संख्या है। '*' विधि के पैरामीटर के रूप में पारित होने के लिए 'ऑर्डर' सरणी के प्रत्येक मान का कारण बनता है। – Phrogz

+0

@Phrogz धन्यवाद! –

5

रूप Array#values_at का उपयोग कर के रूप में @ जेकब का जवाब अच्छा नहीं है (जो मैं लोगों का तर्क था स्वीकार किए जाते हैं जवाब होना चाहिए), लेकिन यहाँ कुछ अन्य मज़ा विकल्प हैं:

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

के रूप में चिह्नित कर सकता हूं यदि मैं सही ढंग से समझता हूं, तो जैकब और टिलो की विधि केवल तभी काम करेगी जब 'ऑर्डर' की संख्या इंडेक्स से मेल खाती है, जबकि आपका दूसरा कोई भी 'ऑर्डर' के लिए काम करेगा। – craq

संबंधित मुद्दे