2011-02-11 17 views
15

क्या यह और अधिक सुरुचिपूर्ण फिर से लिखने का कोई तरीका है? मुझे लगता है कि यह कोड का एक बुरा टुकड़ा है और इसे दोबारा किया जाना चाहिए।रूबी: न्यूनतम सरणी तत्व की अनुक्रमणिका कैसे प्राप्त करें?

>> a = [2, 4, 10, 1, 13] 
=> [2, 4, 10, 1, 13] 
>> index_of_minimal_value_in_array = a.index(a.min) 
=> 3 
+3

गंभीरता से? 'A.index (a.min)'? –

+1

मुझे इस बारे में निश्चित नहीं है। शायद यह मेरी अत्यधिक चिंता है। – kyrylo

+1

मैं कहूंगा कि यह उतना ही साफ है जितना इसे प्राप्त होता है, इसलिए यहां "रिफैक्टरिंग" की आवश्यकता नहीं है। – fresskoma

उत्तर

5

यह अन्य स्थितियों (सभी और केवल पिछले कम से कम तत्व की खोज) के बारे में पढ़ने के लिए दिलचस्प हो जाएगा।

ary = [1, 2, 1] 

# find all matching elements' indexes 
ary.each.with_index.find_all{ |a,i| a == ary.min }.map{ |a,b| b } # => [0, 2] 
ary.each.with_index.map{ |a, i| (a == ary.min) ? i : nil }.compact # => [0, 2] 

# find last matching element's index 
ary.rindex(ary.min) # => 2 
+0

क्या ary.each.with_index ... और ary.each_with_index ... के बीच कोई सराहनीय अंतर है? मैंने पाया, कि प्रत्येक_with_index दस्तावेज नहीं है। लेकिन ary.methods.grep (/ each_with_index /); सच हैं। – kyrylo

+1

वे दोनों [एन्यूमेरेटर] (http://rubydoc.info/stdlib/core/1.9.2/Enumerator) में प्रलेखित हैं, जो ऐरे से विरासत में हैं। 'प्रत्येक .with_index' सरणी लेता है और मूल तत्वों और इंडेक्स वाले आंतरिक सरणी के साथ सरणी की सरणी बनाने के लिए एक अनुक्रमणिका जोड़ता है। फिर आप इसे 'मानचित्र' जैसे अन्य ट्रांसफॉर्मर्स को पास कर सकते हैं। 'प्रत्येक_with_index' सरणी के सरणी पर फिर से चलना चाहता है। यह एक सूक्ष्म अंतर है लेकिन मैं 'प्रत्येक' लूप नहीं चाहता था, मैं बदलना चाहता था। –

+0

यह एल्गोरिदम प्रदर्शन बहुत कम – texasbruce

7

यह केवल एक बार जबकि ary.index(ary.min) सरणी पार करता इसे दो बार पार होगा:

ary.each_with_index.inject(0){ |minidx, (v,i)| v < a[minidx] ? i : minidx } 
+3

'ary.index (ary.min) 'पढ़ने के लिए और अधिक आसान है। – kyrylo

33

मेरा मानना ​​है कि यह केवल एक बार सरणी पार और अभी भी पढ़ने में आसान है जाएगा:

ary = [2,3,4,5,1]  # => [2,3,4,5,1] 
ary.each_with_index.min # => [1, 4] 
         # where 1 is the element and 4 is the index 
+1

साफ समाधान। दुर्भाग्य से 'ऐरे # आखिरी' इसे बदसूरत बनाता है ('ary.each_with_index.min.last')। – kyrylo

3

मुझे वास्तव में @andersonvom का जवाब पसंद है, इसे केवल एक बार सरणी को लूप करने की आवश्यकता है और फिर भी अनुक्रमणिका प्राप्त करें।

और मामले में आप, यहाँ ary.each_with_index.min का उपयोग नहीं करना चाहते हैं तो आप क्या कर सकते हैं:

ary = [2,3,4,5,1]            # => [2,3,4,5,1] 
_, index_of_minimal_value_in_array = ary.each_with_index.min # => [1, 4] 
index_of_minimal_value_in_array        # => 4 
संबंधित मुद्दे

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