2010-04-08 11 views
20

मेरे पास दो रूबी सरणी हैं, और मुझे यह देखने की ज़रूरत है कि उनके पास सामान्य मान हैं या नहीं। मैं सिर्फ एक सरणी में प्रत्येक मान के माध्यम से लूप कर सकता हूं और दूसरे पर शामिल कर सकता हूं? लेकिन मुझे यकीन है कि एक बेहतर तरीका है। यह क्या है? (सरणी दोनों स्ट्रिंग धारण करते हैं।)मैं कैसे जांच सकता हूं कि रूबी सरणी में कई मानों में से एक है या नहीं?

धन्यवाद।

+0

आप परवाह करते हैं क्या तत्वों यह आम में है का प्रयास करें? – Levi

+0

नहीं। मैं बस इतना जानना चाहता हूं कि दोनों में कोई तत्व सामान्य है। – Colen

उत्तर

65

उन्हें Set intersect:

> a1 = [ 'foo', 'bar' ] 
> a2 = [ 'bar', 'baz' ] 
> a1 & a2 
=> ["bar"] 
> !(a1 & a2).empty? # Returns true if there are any elements in common 
=> true 
+3

अच्छी तरह से, ओपी "जांचना" चाहता है, इसलिए एक बूलियन परिणाम बेहतर फिट होगा:! (ए 1 और ए 2)। छूट? – tokland

+4

मैं (ए 1 और ए 2) के साथ जाऊंगा। कई? इसके बजाए! (ए 1 और ए 2)। छूट? – rilla

+1

@rilla 'any? 'इस मामले में काम करता है, लेकिन' झूठी 'और' शून्य 'मानों से निपटने पर नहीं:' [शून्य, झूठी]। कई? # => झूठी'। – Stefan

6

आम में किसी भी मूल्य:

a1 & a2 

यहाँ एक उदाहरण है? आप चौराहे ऑपरेटर का उपयोग कर सकते हैं: &

[ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ] 

आप देख एक पूर्ण चौराहे तथापि के लिए कर रहे हैं (डुप्लिकेट के साथ) समस्या अधिक जटिल है वहाँ पहले से ही यहाँ एक ढेर अतिप्रवाह है: How to return a Ruby array intersection with duplicate elements? (problem with bigrams in Dice Coefficient)

या एक त्वरित snippet जो "real_intersection" को परिभाषित करता है और निम्न परीक्षण

class ArrayIntersectionTests < Test::Unit::TestCase  
    def test_real_array_intersection 
    assert_equal [2], [2, 2, 2, 3, 7, 13, 49] & [2, 2, 2, 5, 11, 107] 
    assert_equal [2, 2, 2], [2, 2, 2, 3, 7, 13, 49].real_intersection([2, 2, 2, 5, 11, 107]) 
    assert_equal ['a', 'c'], ['a', 'b', 'a', 'c'] & ['a', 'c', 'a', 'd'] 
    assert_equal ['a', 'a', 'c'], ['a', 'b', 'a', 'c'].real_intersection(['a', 'c', 'a', 'd']) 
    end 
end 
3

सत्यापित करता चौराहे अच्छा लग रहा है का उपयोग करना है, लेकिन यह अक्षम है। मैं "किसी भी" का उपयोग करूंगा? पहली सरणी पर (ताकि जब दूसरी तत्व में तत्वों में से एक पाया जाता है तो पुनरावृत्ति बंद हो जाती है)। साथ ही, दूसरी सरणी पर एक सेट का उपयोग सदस्यता की जांच तेज कर देगा। यानी .:

a = [:a, :b, :c, :d] 
b = Set.new([:c, :d, :e, :f]) 
c = [:a, :b, :g, :h] 

# Do a and b have at least a common value? 
a.any? {|item| b.include? item} 
# true 

# Do c and b have at least a common value? 
c.any? {|item| b.include? item} 
#false 
+1

बेंचमार्किंग सामान्य मूल्य बनाम ऑब्जेक्ट विशेषता तुलना के आधार पर, (अधिक सौंदर्यपूर्ण रूप से सुखदायक) सेट चौराहे विधि से 1.5-2x तेज होने के लिए दिखाता है। 'खाली 'की जगह' किसी भी? 'का उपयोग करके छेड़छाड़ सेट करें, जैसा उपर्युक्त टिप्पणी में सुझाया गया है, थोड़ा अलग है, लेकिन परिणाम नहीं बदला है। (प्रदर्शन पर सख्ती से विचार करना, और जैसा कि पहले मैच पर 'किसी भी' पूंछ के बाद से अपेक्षित है।) –

0

इस

a1 = [ 'foo', 'bar' ] 
a2 = [ 'bar', 'baz' ] 
a1-a2 != a1 
true 
संबंधित मुद्दे

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