में एक विशेष रेंज से अधिकतम मूल्य प्राप्त करने का सबसे तेज़ तरीका ठीक है, तो कहें कि आपके पास रूबी में वास्तव में बड़ी रेंज है। मैं रेंज में अधिकतम मूल्य प्राप्त करने का एक तरीका खोजना चाहता हूं।रूबी
रेंज अनन्य है (तीन बिंदुओं के साथ परिभाषित) जिसका अर्थ है कि इसमें इसके परिणाम में अंतिम वस्तु शामिल नहीं है। यह इंटीजर, स्ट्रिंग, टाइम, या वास्तव में किसी भी ऑब्जेक्ट से बना हो सकता है जो #<=>
और #succ
का जवाब देता है।
past = Time.local(2010, 1, 1, 0, 0, 0)
now = Time.now
range = past...now
range.include?(now) # => false
अब मुझे पता है मैं सिर्फ अधिकतम मूल्य प्राप्त करने के कुछ इस तरह कर सकता है:
यहाँ एक विशेष रेंज का एक उदाहरण है (जो रेंज में प्रारंभ/समाप्ति वस्तु के लिए केवल आवश्यकताओं हैं):
range.max # => returns 1 second before "now" using Enumerable#max
लेकिन यह निष्पादित करने के लिए एक गैर-मामूली समय लेगा। मुझे यह भी पता है कि मैं जो भी अंत वस्तु है, उससे 1 सेकंड घटा सकता हूं। हालांकि, ऑब्जेक्ट समय के अलावा कुछ और हो सकता है, और यह #-
का भी समर्थन नहीं कर सकता है। मैं एक कुशल सामान्य समाधान खोजना पसंद करूंगा, लेकिन मैं सामान्य केस कोड को एक सामान्य समाधान (बाद में उस पर अधिक) के साथ फॉलबैक के साथ जोड़ना चाहता हूं।
जैसा ऊपर बताया गया है ऊपर Range#last
का उपयोग नहीं किया जाएगा, क्योंकि यह एक विशेष सीमा है और इसमें इसके परिणामों में अंतिम मूल्य शामिल नहीं है।
max = nil
range.each { |value| max = value }
# max now contains nil if the range is empty, or the max value
यह Enumerable#max
क्या करता है (जो रेंज विरासत), सिवाय इसके कि यह तथ्य यह है कि प्रत्येक मूल्य से अधिक होने जा रहा है कारनामे के समान है:
सबसे तेजी से दृष्टिकोण मैं के बारे में सोच सकता है यह था पिछला, इसलिए हम पिछले कुछ मानों की तुलना करने के लिए #<=>
का उपयोग करके छोड़ सकते हैं (जिस तरह से Range#max
करता है) एक छोटा सा समय बचाता है।
अन्य दृष्टिकोण जो मैं सोच रहा था, सामान्य रूबी प्रकारों जैसे इंटीजर, स्ट्रिंग, टाइम, डेट, डेटटाइम के लिए विशेष केस कोड होना था, और उसके बाद उपरोक्त कोड को फ़ॉलबैक के रूप में उपयोग करना था। यह थोड़ा बदसूरत होगा, लेकिन संभवत: अधिक ऑब्जेक्ट प्रकारों का सामना करना पड़ता है क्योंकि मैं बिना किसी पुनरावृत्ति के अधिकतम मूल्य प्राप्त करने के लिए Range#last
से घटाव का उपयोग कर सकता हूं।
क्या कोई इस से अधिक कुशल/तेज़ दृष्टिकोण के बारे में सोच सकता है?
आपकी आखिरी पंक्ति में, आपके पास 'range.last.pred' है। यह मेरे लिए संकलित नहीं है। न तो 'range.last.prev' है। क्या आप उस हिस्से को समझा सकते हैं? –
तो 'pred' का उपयोग करने का प्रयास करें और यदि यह विफल हो जाता है, तो 'range.last-1' को अन्यथा एक अलग समाधान पर वापस आएं –
' pred' रूबी के बाद के संस्करणों में पूर्णांक के लिए लागू किया गया है (यह मेरे 1.8.7- 174, और 1.9+ में होना चाहिए)। यह 'वर्ग 'लागू करने वाली सभी कक्षाओं के लिए उपलब्ध नहीं है, इसलिए इसे स्वयं परिभाषित करना आवश्यक हो सकता है। – molf