ฉันจะได้รับจุดตัดสหภาพและเซตย่อยของอาร์เรย์ใน Ruby ได้อย่างไร


170

ผมต้องการสร้างวิธีการที่แตกต่างกันสำหรับการเรียนที่เรียกว่าMultiset

ฉันมีวิธีที่จำเป็นทั้งหมด แต่ฉันไม่แน่ใจว่าจะเขียนวิธีการแยกจุดร่วมและวิธีย่อยได้อย่างไร

สำหรับจุดตัดและสหภาพรหัสของฉันเริ่มต้นดังนี้:

def intersect(var)
  x = Multiset.new
end

นี่คือตัวอย่าง:

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

แล้วจุดตัดของXและเป็นY[1, 2]



ลิงก์ของ @ Krule เสีย แต่ฉันเชื่อว่าเขากำลังชี้ให้คุณไปยังวิธี Array "&" ที่แยกกันดูคำตอบบางส่วนที่นี่
rogerdpack

นั่นคือคำตอบมากกว่า 8 ปีที่ผ่านมา ใช่นั่นคือจุดตัดกันruby-doc.org/core-2.6.3/Array.html#method-i-26
Krule

คำตอบ:


151

ใช้ความจริงที่ว่าคุณสามารถตั้งค่าการดำเนินการในอาร์เรย์โดยทำ&(ทางแยก), -(ความแตกต่าง) และ|(รวม)

เห็นได้ชัดว่าฉันไม่ได้ใช้ MultiSet กับสเป็ค แต่สิ่งนี้ควรให้คุณเริ่มต้น:

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
2 อาชญากรรมใหญ่ในคำตอบนี้: (1) คำsetว่าชื่อตัวแปรของอาร์เรย์ธรรมดา; (2) ทำซ้ำทุกสิ่งที่Arrayทำไปแล้ว หาก OP ต้องการเพิ่มฟังก์ชันการทำงานให้กับArrayชั้นเรียนด้วยวิธีการเพิ่มเติมคุณควรทำดังนี้: class MultiSet < Array def inclusion?(other) Set.new(self).subset?(Set.new(other)) end end
Rahul Murmuria

1
ตกลง ... นี่อาจเป็นคลาสที่ไร้ประโยชน์ที่สุดที่ฉันเคยเห็นในชีวิตของฉัน ... แต่ฉันรู้ว่านั่นไม่ใช่ความผิดของคุณ
mpowered

313

ฉันถือว่าXและYอาร์เรย์? ถ้าเป็นเช่นนั้นมีวิธีง่ายๆในการทำเช่นนี้:

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]

แหล่ง


17
ในคำอื่น ๆ Multiset < Arrayเพียงแค่ทำ
sawa

จะเป็นอย่างไรถ้าคุณมี x = [1,1,2,4] y = [1,2,2,2] z = [4] คุณจะได้มันมาเพื่อให้คุณแยกระหว่างกับชุดแทนที่จะเป็นทางแยกของทั้งหมด ชุด? ดังนั้นแทนที่จะให้ [] มันให้ [1,2,4]?
mharris7190

1
@ mharris7190 คุณสามารถรวมสหภาพของการแยกเหล่านั้นทั้งหมด:(x & y) | (y & z) | (x & z)
xavdid

2
อย่าลืมยังมี&=, |=และ-=ถ้าคุณยังต้องการที่จะทันทีเก็บค่าเหมือนผม! :)
Pysis

2
สิ่งที่ฉันคิด @sawa เหตุใด OP จึงสร้างคลาสนี้ขึ้นมาตั้งแต่แรก มันไม่ได้ทำอะไรที่ Array ไม่ได้ทำมาจาก Lib มาตรฐานของ Ruby
danielricecodes

6

หากMultisetยื่นออกมาจากArrayชั้นเรียน

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

ยูเนี่ยน

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]

ความแตกต่าง

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

สี่แยก

x & y                # => [1, 2]

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการใหม่ใน Ruby 2.6 คุณสามารถตรวจสอบการโพสต์บล็อกนี้เกี่ยวกับคุณสมบัติใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.