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.