রুবিতে আমি কীভাবে ছেদ, ইউনিয়ন এবং অ্যারের উপসেট পেতে পারি?


170

আমি মাল্টিসেট নামে একটি শ্রেণীর জন্য বিভিন্ন পদ্ধতি তৈরি করতে চাই ।

আমার কাছে সমস্ত প্রয়োজনীয় পদ্ধতি রয়েছে তবে আমি মোড়, ইউনিয়ন এবং উপসেট পদ্ধতি কীভাবে লিখব তা সম্পর্কে আমি নিশ্চিত নই।

চৌরাস্তা এবং ইউনিয়নের জন্য, আমার কোডটি এভাবে শুরু হয়:

def intersect(var)
  x = Multiset.new
end

এখানে একটি উদাহরণ:

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

তার পরে ছেদ Xএবং Yহয় [1, 2]



@ ক্রুলের লিঙ্কটি নষ্ট হয়ে গেছে তবে আমি বিশ্বাস করি যে তিনি আপনাকে অ্যারে "&" পদ্ধতিতে ইশারা করছিলেন যা ছেদ করে, কিছু উত্তর এখানে দেখুন।
রজারডপ্যাক 21 ই

8 বছরেরও বেশি আগে এর উত্তর দেওয়া হয়েছিল। হ্যাঁ, ছেদ ছিল, ruby-doc.org/core-2.6.3/Array.html#method-i-26
Krule

উত্তর:


151

&(ছেদ), -(পার্থক্য) এবং |(ইউনিয়ন) করে আপনি অ্যারেগুলিতে অপারেশন সেট করতে পারেন এই সত্যটি কাজে লাগানো ।

স্পষ্টতই আমি অনুমানের জন্য মাল্টিসেটটি প্রয়োগ করিনি, তবে এটি আপনাকে শুরু করা উচিত:

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
এই উত্তরে ২ টি বড় অপরাধ: (১) setএকটি সরল অ্যারের পরিবর্তনশীল নাম হিসাবে শব্দটি ; (২) Arrayইতিমধ্যে যা কিছু করা যায় তার সবগুলি প্রতিলিপি করা । ওপি যদি Arrayকিছু অতিরিক্ত পদ্ধতি সহ ক্লাসে কার্যকারিতা যুক্ত করতে চায় তবে আপনার সহজভাবে করা উচিত: class MultiSet < Array def inclusion?(other) Set.new(self).subset?(Set.new(other)) end end
রাহুল মুরমুরিয়া

1
সম্মত ... এটি সম্ভবত আমার জীবনে দেখা সবচেয়ে অযথা ক্লাস ... তবে আমি বুঝতে পারি যে এটি আসলে আপনার দোষ নয়।
চালিত

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
সাভা

আপনার যদি 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
ভুলবেন না রয়েছে &=, |=এবং -=মত আমি করেন তাহলে আপনি করতে চান অবিলম্বে মান দোকান! :)
পিসিস

2
ঠিক কী আমি @ সাওয়া ভেবেছিলাম। ওপি প্রথম শ্রেণিতে এই শ্রেণিটি তৈরি করছে কেন? এটি এমন কোনও কাজ করে না যা অ্যারে ইতিমধ্যে রুবির স্ট্যান্ডার্ড লিব থেকে না করে।
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]

রুবি ২.6 এ নতুন পদ্ধতি সম্পর্কে আরও তথ্যের জন্য, আপনি এই ব্লগ পোস্টটির নতুন বৈশিষ্ট্যগুলি সম্পর্কে চেক করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.