Ruby'de dizilerin kesişimini, birleşimini ve alt kümesini nasıl alabilirim?


170

Multiset adı verilen bir sınıf için farklı yöntemler oluşturmak istiyorum .

Gerekli tüm yöntemlere sahibim, ancak kavşak, birleşim ve alt küme yöntemlerinin nasıl yazılacağından emin değilim.

Kavşak ve birleşim için kodum şöyle başlar:

def intersect(var)
  x = Multiset.new
end

İşte bir örnek:

X = [1, 1, 2, 4]
Y = [1, 2, 2, 2]

sonra kesişme Xve Yolur [1, 2].



@ Krule'un bağlantısı koptu, ancak sizi kesişme yapan Array "&" yöntemine yönlendirdiğine inanıyorum, burada bazı cevaplara bakın.
— rogerdpack

Bu, 8 yıldan fazla bir süre önce cevaplandı. Evet, kavşaktı, ruby-doc.org/core-2.6.3/Array.html#method-i-26
— Krule

Yanıtlar:


151

Diziler üzerinde &(kavşak), -(fark) ve| (birleşim) .

Açıkçası ben SpecSet MultiSet uygulamak vermedi, ama bu başlamak gerekir:

class MultiSet
  attr_accessor :set
  def initialize(set)
    @set = set
  end
  # intersection
  def &(other)
    @set & other.set
  end
  # difference
  def -(other)
    @set - other.set
  end
  # union
  def |(other)
    @set | other.set
  end
end

x = MultiSet.new([1,1,2,2,3,4,5,6])
y = MultiSet.new([1,3,5,6])

p x - y # [2,2,4]
p x & y # [1,3,5,6]
p x | y # [1,2,3,4,5,6]

8
Bu cevapta 2 büyük suç: (1) setDüz dizinin değişken adı olarak kullanılan kelime ; (2) ArrayZaten olan her şeyi çoğaltma . Eğer OP Arraybazı ek yöntemlerle sınıfa işlevsellik eklemek istiyorsa şunları yapmalısınız: class MultiSet < Array def inclusion?(other) Set.new(self).subset?(Set.new(other)) end end
— Rahul Murmuria 11:08

1
Kabul ediyorum ... bu muhtemelen hayatımda gördüğüm en işe yaramaz sınıf ... ama bunun aslında senin hatan olmadığını anlıyorum.
— mpowered

314

Ben varsayalım Xve Ydizilerdir? Öyleyse, bunu yapmanın çok basit bir yolu var:

x = [1, 1, 2, 4]
y = [1, 2, 2, 2]

# intersection
x & y            # => [1, 2]

# union
x | y            # => [1, 2, 4]

# difference
x - y            # => [4]

Kaynak


17
Başka bir deyişle, sadece yapın Multiset < Array.
— sawa

Ya x = [1,1,2,4] y = [1,2,2,2] z = [4] Eğer kümeler arasında her şeyin kesişimi yerine kavşak vermesini nasıl sağlayabilirsiniz? kümeler? Yani size [] vermek yerine, size [1,2,4] veriyor mu?
— mharris7190

1
@ mharris7190 tüm bu kavşakların birliğini alabilirsiniz:(x & y) | (y & z) | (x & z)
— xavdid

2
Unutmayın orada da &=, |=ve -=ayrıca isterseniz benim yaptığım gibi hemen değerini saklamak! :)
— Pysis

2
Tam olarak düşündüğüm şey @sawa. OP neden bu sınıfı ilk etapta oluşturuyor? Array'ın Ruby Standart Lib'den yapmadığı hiçbir şey yapmaz.
— danielricecodes

6

Eğer Multisetuzanan Arraysınıfın

x = [1, 1, 2, 4, 7]
y = [1, 2, 2, 2]
z = [1, 1, 3, 7]

BİRLİK

x.union(y)           # => [1, 2, 4, 7]      (ONLY IN RUBY 2.6)
x.union(y, z)        # => [1, 2, 4, 7, 3]   (ONLY IN RUBY 2.6)
x | y                # => [1, 2, 4, 7]

FARKI

x.difference(y)      # => [4, 7] (ONLY IN RUBY 2.6)
x.difference(y, z)   # => [4] (ONLY IN RUBY 2.6)
x - y                # => [4, 7]

KAVŞAK

x & y                # => [1, 2]

Ruby 2.6'daki yeni yöntemler hakkında daha fazla bilgi için, bu blog gönderisini yeni özellikleri hakkında kontrol edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.