2010-07-13 12 views
43

मैं कोड की कुछ पंक्तियां उत्पन्न कर सकता हूं जो ऐसा करेंगे लेकिन मुझे आश्चर्य है कि ऐसा करने के लिए एक अच्छा साफ रूबीस्क तरीका है। यदि मैं स्पष्ट नहीं हूं, तो मैं जो खोज रहा हूं वह एक सरणी विधि है जो [3,3,3,3,3] या ["rabbits","rabbits","rabbits"] दिए गए हैं (0) [1,2,3,4,5] या ["rabbits","rabbits","hares"] के साथ झूठी वापसी होगी।यदि मैं किसी सरणी में सभी आइटम समान हैं तो मैं कैसे परीक्षण करूं?

धन्यवाद

उत्तर

54
class Array 
    def same_values? 
    self.uniq.length == 1 
    end 
end 


[1, 1, 1, 1].same_values? 
[1, 2, 3, 4].same_values? 

क्या इस एक के बारे में? यह एक खाली सरणी के लिए झूठी रिटर्न देता है, हालांकि आप इसे < = 1 में बदल सकते हैं और यह उस मामले में सच हो जाएगा। आपको जिस चीज की आवश्यकता है उसके आधार पर।

+2

यह सुंदर सुरुचिपूर्ण है। मैं सिर्फ अपने कोड में .uniq.length == 1 का उपयोग सीधे आपके कोड में कर सकता हूं (मैं केवल इसे एक बार उपयोग कर रहा हूं इसलिए मैं इसे DRY रख रहा हूं)। अगर ss_values ​​में बनाया गया था तो यह अच्छा होगा? तरीका। मुझे अपने कोड में रिक्त सरणी मामले के बारे में चिंता करने की आवश्यकता नहीं है) यह मेरी स्थिति में नहीं आना चाहिए और बी) अगर ऐसा होता तो मैं झूठी वापसी करना चाहता हूं। धन्यवाद। – brad

+2

ध्यान दें कि 'uniq'' हैश' और 'eql? 'का उपयोग करता है और' ==' जो आप चाहते हैं या नहीं हो सकता है। –

+1

कोई भी इसे self.flatten.uniq.lenth == 1 –

67

आप Enumerable#all? जो सच लौटाता है यदि दिए गए ब्लॉक संग्रह में सभी तत्वों के लिए सही रिटर्न उपयोग कर सकते हैं।

array.all? {|x| x == array[0]} 

(यदि सरणी खाली है, ब्लॉक कहा जाता है कभी नहीं, ऐसा करने से array[0] सुरक्षित है।)

+0

कैसे के बारे में '(array.any {| x | एक्स = सरणी [0]!}?)'!? हालांकि यह एक अलग मूल्य की पहली घटना के बाद सभी तत्वों को फिर से शुरू नहीं करेगा। –

+4

@ Nu-hin न तो सब कुछ होगा? – sepp2k

+0

हाँ, मेरा बुरा, धन्यवाद। –

9

मुझे भी पसंदीदा उत्तर पसंद है, छोटा और प्यारा। अगर सभी तत्वों को इस तरह के संख्यात्मक या स्ट्रिंग के रूप में ही Enumerable वर्ग, से थे, एक का उपयोग कर सकता है

def all_equal?(array) array.max == array.min end 
+0

Slick। बहुत चालाक – brad

+2

वस्तुओं को एक ही कक्षा में होने की आवश्यकता नहीं है, उन्हें केवल '<=>' (स्पेसशिप ऑपरेटर) को लागू करने में सक्षम होना चाहिए। –

+0

@AndrewGrimm स्पेसशिप ऑपरेटर इस कोड को असफल होने का कारण बनता है यदि ऑब्जेक्ट्स विभिन्न प्रकार के होते हैं। –

1

मैं उपयोग करने के लिए प्रयोग किया है:

def add_equal?(arr) arr.reduce { |x,y| x == y ? x : nil } end 

यह विफल हो सकता है जब arrnil शामिल हैं।

1

मैं का प्रयोग करेंगे:

array = ["rabbits","rabbits","hares", nil, nil] 
array.uniq.compact.length == 1 
संबंधित मुद्दे

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