रूबी के साथ न्यूनतम / अधिकतम कैसे प्राप्त करें


415

मैं उपयोग करना चाहता हूं min(5,10), या Math.max(4,7)। क्या रूबी में इस आशय के कार्य हैं?

जवाबों:


722

तुम कर सकते हो

[5, 10].min

या

[4, 7].max

वे Enumerable मॉड्यूल से आते हैं , इसलिए कुछ भी जिसमें Enumerableवे विधियाँ उपलब्ध होंगी।

v2.4 स्वयं का परिचय देता है Array#minऔर Array#max, जो एनुमरबल के तरीकों की तुलना में तेज़ हैं क्योंकि वे कॉल करना छोड़ देते हैं #each

@nicholasklick में एक अन्य विकल्प का उल्लेख है Enumerable#minmax, लेकिन इस बार एक सरणी लौट रही है [min, max]

[4, 5, 7, 10].minmax
=> [4, 10]

3
@kaz मुझे यकीन नहीं है कि मैं आपकी टिप्पणी को समझूंगा।
जिग्गी

3
@ काज़ ... आपको एहसास std::max(4, 7)है कि "विराम चिह्न" की तुलना में अधिक है [4, 7].max?
22 फरवरी को

3
@Doorknob आपको पता है कि std::maxआपके नामस्थान में आयात किया जा सकता है, इसलिए यह बस बन जाता है max(4, 7)। रुको; ऊपर देखते हुए, मैं देखता हूं मैंने कहा कि पहले से ही।
काज

18
विराम चिह्न यहाँ समस्या नहीं है। कुछ मूल्यों का अधिकतम पाने के लिए एक संपूर्ण ढेर आवंटन यहां अंतर्निहित कुरूपता है।
kdbanman

7
रूबी मुख्य रूप से प्रोग्रामर के लिए है न कि कंप्यूटर के लिए। मात्ज़ के शब्दों में "मुझे उम्मीद है कि रूबी दुनिया के हर प्रोग्रामर को उत्पादक होने और प्रोग्रामिंग का आनंद लेने और खुश रहने में मदद करेगी। यह रूबी भाषा का प्राथमिक उद्देश्य है।" यह रूबी पर विकिपीडिया पृष्ठ से है।
अरोन-कोडिंग

52

आप उपयोग कर सकते हैं

[5,10].min 

या

[4,7].max

यह Arrays के लिए एक विधि है।


20
तकनीकी रूप से यह Enumerables के लिए एक विधि है, न कि Arrays।
meagar

1
यह En2er पर V2.4 के बाद से बेहतर प्रदर्शन के साथ एरे के लिए एक विधि है
आंद्रे फिगएरेडो

25

उन सभी परिणामों में दो से अधिक तर्कों को संभालने के लिए एक उत्साही प्रयास में कचरा उत्पन्न होता है। मैं यह देखने के लिए उत्सुक हूँ कि वे अच्छे 'ol' की तुलना में कैसा प्रदर्शन करते हैं:

def max (a,b)
  a>b ? a : b
end

जो, वैसे, मेरे आधिकारिक आपके प्रश्न का उत्तर है।


कुछ रूंबिंग हैं जो रूबी 2.4 का अनुकूलन कर रही हैं [a,b].max, लेकिन यह अभी भी स्पष्ट नहीं है कि यह उपरोक्त कार्यान्वयन से तेज है या नहीं। blog.bigbinary.com/2016/11/17/…
डेव मोर्स

2
यह माइक्रो-ऑप्टिमाइज़ेशन है, वे दोनों इतनी तेज़ हैं, अंतर नगण्य है, बेंचमार्क देखें: repl.it/@AndreFigueiredo/DearWeirdSweepsoftware
आंद्रे

1
क्या यह रूपरेखा जीसी में बिताए समय को ध्यान में रखती है?
डेव मोर्स

20

यदि आपको हैश का अधिकतम / मिनट खोजने की आवश्यकता है, तो आप उपयोग कर सकते हैं #max_byया कर सकते हैं#min_by

people = {'joe' => 21, 'bill' => 35, 'sally' => 24}

people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]

20

प्रदान किए गए उत्तरों के अलावा, यदि आप Enumerable # max को एक अधिकतम विधि में बदलना चाहते हैं जो एक चर संख्या या तर्कों को कॉल कर सकता है, जैसे कुछ अन्य प्रोग्रामिंग भाषाओं में, आप लिख सकते हैं:

def max(*values)
 values.max
end

आउटपुट:

max(7, 1234, 9, -78, 156)
=> 1234

यह एरे ऑब्जेक्ट को प्रदान की गई तर्कों को बनाने के लिए स्पैट ऑपरेटर के गुणों का दुरुपयोग करता है या यदि कोई तर्क प्रदान नहीं किया जाता है तो खाली सरणी ऑब्जेक्ट। बाद के मामले में, विधि वापस आ जाएगी nil, क्योंकि Enumerable # max को खाली सरणी ऑब्जेक्ट रिटर्न पर कॉल करना nil

यदि आप मैथ मॉड्यूल पर इस विधि को परिभाषित करना चाहते हैं, तो यह ट्रिक करना चाहिए:

module Math
 def self.max(*values)
  values.max
 end
end

ध्यान दें कि Enumerable.max, कम से कम, टर्नरी ऑपरेटर ( ?:) की तुलना में दो गुना धीमा है । सरल और तेज़ विधि के लिए डेव मोर्स का उत्तर देखें ।


लेकिन क्या मानक कक्षाओं और मॉड्यूल को फिर से खोलना बुरा व्यवहार नहीं माना जाता है?
रेडिएंटशॉ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.