রুবিতে দুটি অ্যারে মার্জ এবং ইন্টারলিভ করুন


106

আমার কাছে নিম্নলিখিত কোড রয়েছে:

a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]

আমি অ্যারে একত্রীকরণ করতে চান sঅ্যারের মধ্যে aযা আমাকে দিতে হবে:

["Cat", "and", "Dog", "&", "Mouse"]

রুবি অ্যারে এবং অগণিত ডক্সের মাধ্যমে সন্ধান করছি, আমি এমন কোনও পদ্ধতি দেখছি না যা এটি সম্পাদন করবে।

প্রতিটি অ্যারের মাধ্যমে পুনরাবৃত্তি না করে আমি কি এটি করার উপায় আছে?


একটি সর্বদা 3 টি উপাদান এবং দুটি থাকবে? আরও কিছু উদাহরণ দরকারী হবে।
টোকল্যান্ড 5'11

উত্তর:


171

আপনি এটি দিয়ে এটি করতে পারেন:

a.zip(s).flatten.compact

4
যদি a3 টিরও বেশি উপাদান থাকে?
মাইকেল কোহল

116
["ক", "বি"] .কনক্যাট (["সি", "ডি"]) # => ["এ", "বি", "সি", "ডি"]
লিও রোমানভস্কি

30
@Leo, @chuck: আপনি উদাহরণস্বরূপ পড়া আপনি ক্রিস করতে চায় দেখতে হবে বইয়ের পাতার মাঝে মাঝে উপাদান, না কনক্যাটেনেট তাদের। মূলত, তিনি চান [a, s].transposeযে দুটি সারিটি সামঞ্জস্য না #zipকরে, স্পষ্ট সমাধান হিসাবে ছেড়ে । এবং আমি বিশ্বাস করি না যে তার অর্থ হ'ল তিনি aমিউটেশন করা হয়েছে কিনা তা সত্যই যত্নবান করেছিলেন ... আমি মনে করি না যে তিনি কোনও বিবর্তিত বনাম কার্যকরী সমাধান সম্পর্কে মোটেই মন্তব্য করছেন, তিনি কেবল প্যাটার্নটি বর্ণনা করার চেষ্টা করছেন।
ডিজিটালরোস

15
+1 একমাত্র ব্যক্তি, যিনি আসলে ব্লুমিন 'প্রশ্নটি পড়েছেন! > _ <
ম্যাট ফ্ল্যাচার

5
আরও গুরুত্বপূর্ণ বিষয়, যদি দুটি অ্যারেটি অসম দৈর্ঘ্যের হয়? বিশেষত যদি s দীর্ঘ হয়? আমি মনে করি ক্রিস যে উদাহরণটি দিয়ে কাজ করছেন সে প্রকৃত তথ্য নয় যা আমি নিরাপদে ধরে নিতে পারি। বিবেচনা করুন: []। জিপ [1, 2] => নীল (তার উপর # ফ্লাটেন কল করতে খুব কষ্ট হচ্ছে) [3,4]। জিপ ([1, 3, 5, 7]) => [[3 , 1], [4, 3]] (ওহো, মনে করি আমরা 2nd অ্যারের মধ্যে গত কয়েক উপাদান যত্ন সম্পর্কে না)
hoff2

32

ক্রিস ক্রমকে যে আদেশ অনুসারে অনুরোধ করেছিল তাতে কোনও ফলাফল অ্যারে দেবে না, তবে যদি ফলাফল অ্যারের ক্রমটি বিবেচনা না করে তবে আপনি কেবল ব্যবহার করতে পারেন a |= b। আপনি যদি পরিবর্তন করতে না চান a, আপনি লিখতে a | bএবং পরিবর্তনকে ফলাফল নির্ধারণ করতে পারেন ।

অ্যারে শ্রেণীর জন্য সেট ইউনিয়নের ডকুমেন্টেশনটি http://www.ruby-doc.org/core/classes/Array.html#M000275দেখুন

এই উত্তরটি ধরে নিয়েছে যে আপনি অনুলিপি অ্যারে উপাদানগুলি চান না। আপনি যদি চূড়ান্ত অ্যারেতে সদৃশ উপাদানগুলিকে মঞ্জুরি a += bদিতে চান তবে কৌশলটি করা উচিত। আবার, যদি আপনি পরিবর্তন করতে না চান a, ব্যবহার করুন a + bএবং একটি পরিবর্তনশীলকে ফলাফল নির্ধারণ করুন।

এই পৃষ্ঠায় কিছু মন্তব্যের প্রতিক্রিয়া হিসাবে, এই দুটি সমাধান যে কোনও আকারের অ্যারে নিয়ে কাজ করবে।


এটি অবশ্যই সেরা বলে মনে হচ্ছে।
d

11
এটি দেয় ["Cat", "Dog", "Mouse", "and", "&"], যা ওপি চেয়েছিল তা নয়।
অ্যান্ড্রু গ্রিম

অসাধারণ কল, অ্যান্ড্রু। আমি আমার উত্তরটি আপডেট করে বলব যে আমি ক্রিসের প্রশ্নের উত্তর দিলাম না।
মাইকেল স্টালকার

28

আপনি যদি সদৃশ না চান তবে কেন কেবল ইউনিয়ন অপারেটরটি ব্যবহার করবেন না :

new_array = a | s

1
একটি আন্ডাররেটেড, সাধারণ, মার্জিত সমাধানের জন্য একটি +1 প্রদান করা।
গিয়াকোমো 1968

অবশ্যই প্রশ্নের উত্তর! প্রশ্নটি ছিল: "আমি অ্যারেগুলিকে অ্যারেতে একীভূত করতে চাই"
ডগলাস

ভাল সমাধান - তবে এটি ফলাফলের ক্রম পরিবর্তন করে। এর ফলাফলগুলি sনতুন অ্যারের শেষে হবে।
হেন্দ্রিক

1
যদিও ওপি চেয়েছিল উপাদানগুলির ক্রম হবে না।
টোকল্যান্ড

6
s.inject(a, :<<)

s   #=> ["and", "&"]
a   #=> ["Cat", "Dog", "Mouse", "and", "&"]

এটি আপনাকে যে আদেশ চেয়েছিল তা দেয় না, তবে এটিতে যুক্ত হয়ে দুটি অ্যারে মার্জ করার একটি দুর্দান্ত উপায়।


আমি এটি সংক্ষিপ্ত এবং পরিষ্কার পছন্দ। :)
নফা বাউটর

6

এখানে এমন একটি সমাধান রয়েছে যা বিভিন্ন মাপের একাধিক অ্যারে (সাধারণ সমাধান) মঞ্জুরি দেয়:

arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
 ["and", "&"],
 ["hello", "there", "you"]]

first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]

2
নিস! একটি সীমাবদ্ধতা, প্রথম অ্যারেটি দীর্ঘতম হতে হবে।
ব্রায়ান লো

@ ব্রায়ানলও দুর্দান্ত ধর!
আবদো

5

এটি ঠিক মার্জিত নয়, তবে এটি কোনও আকারের অ্যারেগুলির জন্য কাজ করে:

>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2] 
#=> ["Cat", "and", "Dog", "&", "Mouse"]

অদ্ভুত প্রান্তের মামলাগুলির জন্য +1, আমি মনে করি i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]যদিও এটি সমানভাবে বৈধ হবে।
মিউ খুব ছোট

আমি নিশ্চিত ছিলাম না যে ওপি বিকল্প চায় কিনা andএবং &তাই aকোনও দৈর্ঘ্যের সুযোগ দিয়ে আমি তাকে যথাসম্ভব আক্ষরিকভাবে নিয়েছিলাম ।
মাইকেল কোহল

3

প্রথম অ্যারেটি দীর্ঘতম না হলেও এবং কোনও সংখ্যক অ্যারে গ্রহণ না করে এমন কী আরও সাধারণ সমাধান সম্পর্কে কাজ করা যায়?

a = [
    ["and", "&"],
    ["Cat", "Dog", "Mouse"]
]

b = a.max_by(&:length)
a -= [b]
b.zip(*a).flatten.compact

 => ["Cat", "and", "Dog", "&", "Mouse"]

2

অবস্থা যেখানে উভয় হ্যান্ডেল করতে a& sএকই আকারের নয়:

a.zip(s).flatten.compact | s
  • .compactএর চেয়ে বড় nilহলে সরিয়ে ফেলবেas
  • | ssকখন থেকে অবশিষ্ট আইটেম যুক্ত করা হবেa ছোট হবেs

1

আন্তঃলিভ করার একটি উপায় এবং জিপ পদ্ধতির জন্য সবচেয়ে বড় অ্যারেটি কোনটি গ্যারান্টিযুক্ত তা হ'ল nilঅন্য অ্যারের আকার পর্যন্ত একটি অ্যারে পূরণ করা । এই পদ্ধতিতে, আপনি গ্যারান্টিও দেন যে কোন অ্যারের উপাদানটি প্রথম অবস্থানে থাকবে:

preferred_arr = ["Cat", "Dog", "Mouse"]
other_arr = ["and","&","are","great","friends"]

preferred_arr << nil while preferred_arr.length < other_arr.length
preferred_arr.zip(other_arr).flatten.compact
#=> ["Cat", "and", "Dog", "&", "Mouse", "are", "great", "friends"]

1
একটু ভাল: preferred_arr.zip(other_arr).flatten | other_arr(শূন্য ব্যাকফিলিং ছাড়া)
আদম Fendley

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