كيف يمكنني التحقق مما إذا كانت صفيف روبي تتضمن واحدة من عدة قيم؟

StackOverflow https://stackoverflow.com/questions/2603895

  •  25-09-2019
  •  | 
  •  

سؤال

لدي صفان روبي ، وأحتاج إلى معرفة ما إذا كان لديهم أي قيم مشتركة. يمكنني فقط أن أحلق كل من القيم في صفيف واحد وتشمل؟ () من جهة أخرى ، لكنني متأكد من أن هناك طريقة أفضل. ما هذا؟ (المصفوفات كلاهما عقد سلاسل.)

شكرًا.

هل كانت مفيدة؟

المحلول

ضبط المتقاطع هم:

a1 & a2

هذا مثال:

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

نصائح أخرى

أي قيمة مشتركة؟ يمكنك استخدام مشغل التقاطع: &

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

إذا كنت تبحث عن تقاطع كامل ولكن (مع التكرارات) ، فإن المشكلة أكثر تعقيدًا ، فهناك بالفعل تدفق مكدس هنا: كيفية إعادة تقاطع صفيف روبي مع عناصر مكررة؟ (مشكلة مع BigRams في معامل النرد)

أو سريع مقتطف الذي يحدد "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

استخدام التقاطع يبدو لطيفًا ، لكنه غير فعال. أود استخدام "أي؟" في المصفوفة الأولى (حتى يتوقف التكرار عند العثور على أحد العناصر في المصفوفة الثانية). أيضًا ، سيجعل استخدام مجموعة على المصفوفة الثانية شيكات العضوية بسرعة. بمعنى آخر:

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

جرب هذا

a1 = [ 'foo', 'bar' ] 
a2 = [ 'bar', 'baz' ]
a1-a2 != a1
true
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top