কম্পিউটার টিউটোরিয়াল

রুবি সর্টিংে দক্ষতা: অ্যারে ও হ্যাশ টেকনিকস ব্যাবহারিক উদাহরণসহ

রুবিতে অ্যারে সর্ট করা সহজ!

আপনার কোনো ফ্যান্সি অ্যালগরিদম লিখতে হবে না আপনার কাঙ্খিত ফলাফল পেতে।

তাহলে কী দরকার?

রুবির বিল্ট-ইন সর্টিং মেথডগুলো বোঝা।

এগুলো:

  • sort
  • sort_by
  • sort!

এই মেথডগুলো কীভাবে কাজ করে এবং কেন সেগুলো আলাদা?

এই নিবন্ধে আপনি সেটি খুঁজে পাবেন।

আপনি অ্যারে সর্ট করার বিভিন্ন উপায় শিখবেন, sort মেথড থেকে শুরু করে, তারপর উন্নত সর্টিং (একাধিক ভ্যালু দিয়ে) এর জন্য sort_by এবং আরও অনেক কিছু।

চলুন শুরু করি!

রুবির Sort ও Sort! মেথড ব্যবহার শিখুন

সর্ট করার সবচেয়ে বেসিক ফর্ম রুবির sort মেথড দ্বারা প্রদান করা হয়, যা Enumerable মডিউলে সংজ্ঞায়িত।

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

 numbers = [5,3,2,1] numbers.sort # [1,2,3,5] 

লক্ষ্য করুন sort ফলাফলসহ একটি নতুন অ্যারে রিটার্ন করে।

সর্ট করা এলিমেন্টগুলোর একটি অ্যারে!

"ইন-প্লেস" সর্ট করার জন্যও সম্ভব sort! মেথড ব্যবহার করে।

এর মানে হলো মূল অ্যারে পরিবর্তন হবে একটি নতুন তৈরি করার বদলে, যা পারফরম্যান্সের জন্য ভালো হতে পারে।

sort_by দিয়ে কাস্টোমাইজড সর্টিং

sort_by মেথড দিয়ে আপনি আরও উন্নত ও আকর্ষণীয় সর্টিং করতে পারেন।

আপনি করতে পারবেন:

  • স্ট্রিং দৈর্ঘ্য অনুযায়ী সর্ট
  • স্ট্রিং কন্টেন্ট অনুযায়ী সর্ট
  • সংখ্যা জোড় কি বিজোড় সেট অনুযায়ী সর্ট

আপনি এটি sort_by মেথড এবং একটি রুবি ব্লক দিয়ে করতে পারেন।

উদাহরণস্বরূপ:

 strings = %w(foo test blog a) strings.sort_by(&:length) # ["a", "foo", "test", "blog"] 

এটি কীভাবে কাজ করে?

খুব সহজ, sort_by মেথড একটি সাংখ্যিক মান আশা করে, সেটাই length কাজ করে।

যদি আপনি এটি বুঝতে পারেন, তবে আপনি এই মেথডটি ব্যবহার করে কুল জিনিসগুলো করতে পারেন, যেমন বড় হাতের অক্ষরে শুরু হওয়া শব্দগুলো সর্ট করা এবং বাকিগুলো যেন যেন থাকুন।

এভাবে:

 def sort_by_capital_word(text) text .split .sort_by { |w| w[0].match?(/[A-Z]/) ? 0 : 1 } .join(" ") end sort_by_capital_word("calendar Cat tap Lamp") # "Cat Lamp calendar tap" 

নিয়মিত sort মেথডও ব্লক দিয়ে কাস্টম সর্টিং করা সম্ভব।

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

 strings = %w(foo test blog a) strings.sort { |a,b| a.length <=> b.length } # ["a", "foo", "test", "blog"] 

নোট: এই <=> চিহ্নটি "দ্য স্পেসশিপ অপারেটর" নামে পরিচিত এবং এটি একটি মেথড যা আপনি আপনার ক্লাসে ইমপ্লিমেন্ট করতে পারেন। এটি ১ (অধিক), ০ (সমান) বা -১ (কম) রিটার্ন করা উচিত।

সাধারণত, আমি sort_by মেথডটিই পছন্দ করি কারণ উদ্দেশ্য আরও স্পষ্ট, পড়া সহজ এবং এটি কিছুটা দ্রুতও।

রিভার্স অর্ডারে সর্ট

রিভার্স অর্ডারে সর্ট করার কথা কী?

আপনি সর্ট করার পর reverse মেথড ব্যবহার করতে পারেন, অথবা একটি ব্লক এবং আপনি যে জিনিসটি সর্ট করছেন তার সামনে একটি মাইনাস চিহ্ন দিতে পারেন।

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

 strings = %w(foo test blog a) strings.sort_by { |str| -str.length } # ["blog", "test", "foo", "a"] 

ফ্যান্সি না হলেও, কাজ করে! 🙂

অ্যালফানিউমেরিক সর্টিং

মান लीজिए আপনি সংখ্যা ধারণকারী স্ট্রিংগুলির একটি লিস্ট সংখ্যাসূচকভাবে সর্ট করতে চান।

এভাবে:

 music = %w(21.mp3 10.mp3 5.mp3 40.mp3) 

ডিফল্টভাবে, আপনি এই লিস্টটিকে আপনার পছন্দ মতো সর্ট করা পাবেন না।

উদাহরণ:

 music.sort # ["10.mp3", "21.mp3", "40.mp3", "5.mp3"] 

কিন্তু আপনি sort_by ব্যবহার করে এটি ঠিক করতে পারেন:

 music.sort_by { |s| s.scan(/\d+/).first.to_i } # ["5.mp3", "10.mp3", "21.mp3", "40.mp3"] 

আমি একটি রেগুলার এক্সপ্রেশন (\d+) ব্যবহার করেছি সংখ্যাগুলো ম্যাচ করার জন্য, তারপর প্রথম সংখ্যা (first) নেওয়া এবং সেটিকে ইন্টিজার অবজেক্টে রূপান্তর (to_i) করা।

রুবিতে হ্যাশ সর্ট করা

আপনি শুধু অ্যারে সর্ট করতে সীমাবদ্ধ নন, আপনি হ্যাশও সর্ট করতে পারেন।

উদাহরণ:

 hash = {coconut: 200, orange: 50, bacon: 100} hash.sort_by(&:last) # [[:orange, 50], [:bacon, 100], [:coconut, 200]] 

এটি ভ্যালু অনুযায়ী সর্ট করবে, কিন্তু একটু আকর্ষণীয় বিষয় লক্ষ্য করুন, আপনি যা পাচ্ছেন সেটি হ্যাশ নন।

হ্যাশ সর্ট করলে আপনি একটি মাল্টি-ডাইমেনশনাল অ্যারে পাবেন।

এটিকে আবার হ্যাশে রূপান্তর করতে আপনি Array#to_h মেথড ব্যবহার করতে পারেন।

একাধিক ভ্যালু দিয়ে সর্টিং

আপনি একাধিক অ্যাট্রিবিউট দিয়ে কিছু সর্ট করতে চাইতে পারেন, অর্থাৎ আপনি প্রথমে ডেট অনুযায়ী সর্ট করেন (উদাহরণস্বরূপ), কিন্তু একই ডেটের একাধিক জিনিস থাকলে টাই হয়।

টাই ভাঙার জন্য আপনি একটি সেকেন্ডারি অ্যাট্রিবিউট ব্যবহার করতে পারেন।

উদাহরণ:

 Event = Struct.new(:name, :date) events = [] events << Event.new("book sale", Time.now) events << Event.new("course sale", Time.now) events << Event.new("new subscriber", Time.now) events << Event.new("course sale", Time.now + 1.day) events.sort_by { |event| [event.date, event.name] } 

চাবিকাঠি হলো sort_by ব্লকের ভিতরে অ্যারে।

যেখানে আপনি প্রাইমারি সর্টিং অ্যাট্রিবিউটকে অ্যারের প্রথম এলিমেন্ট হিসেবে সেট করেন (event.date) এবং তারপর সেকেন্ডারি টাই-ব্রেকার অ্যাট্রিবিউট (event.name)।

QuickSort ইমপ্লিমেন্টেশন

শুধু মজার জন্য আমরা আমাদের নিজস্ব সর্টিং মেথড ইমপ্লিমেন্ট করব। এটি বিল্ট-ইন সর্ট মেথডগুলোর চেয়ে ধীর হবে, কিন্তু কম্পিউটার সায়েন্স পছন্দ করলে এটি একটি আকর্ষণীয় এক্সারসাইজ।

 def quick_sort(list) return [] if list.empty? groups = list.group_by { |n| n <=> list.first } less_than = groups[-1] || [] first = groups[0] || [] greater_than = groups[1] || [] quick_sort(less_than) + first + quick_sort(greater_than) end p quick_sort [3, 7, 2, 1, 8, 12] # [1, 2, 3, 7, 8, 12] 

Quick sort-এর আইডিয়া হলো র‍্যান্ডমলি একটি সংখ্যা বেছে নেওয়া এবং তারপর আমরা যে লিস্টটি সর্ট করছি তাকে দুটি গ্রুপে ভাগ করা।

একটি গ্রুপ হলো বেছে নেওয়া সংখ্যাকে চেয়ে ছোট সংখ্যাগুলো এবং অন্যটি বেছে নেওয়া সংখ্যাকে চেয়ে বড় সংখ্যাগুলো।

তারপর আমরা এই অপারেশনটি বারবার दुहरাই যতক্ষণ না লিস্টটি সর্ট হয়ে যায়।

বেঞ্চমার্ক

চলুন দেখি এই সব সর্টিং মেথডগুলো পারফরম্যান্সের দিক থেকে কীভাবে একে অপরের সাথে তুলনা করা যায়।

Ruby 2.4.0:

 sort!: 1405.8 i/s sort: 1377.6 i/s - same-ish: difference falls within error sort_by reverse: 196.6 i/s - 7.15x slower sort_by: 183.7 i/s - 7.65x slower sort_by minus: 172.3 i/s - 8.16x slower sort with block: 164.1 i/s - 8.57x slower 

দেখতে পাচ্ছেন, নিয়মিত sort মেথড sort_by-এর চেয়ে অনেক দ্রুত, কিন্তু ব্লক ব্যবহার না করলে এটি তত লচীলা নয়।

ভিডিও

সারসংক্ষেপ

আপনি শিখেছেন কীভাবে sort ও sort_by মেথডগুলো ব্যবহার করে আপনার অ্যারে ও হ্যাশগুলো বিভিন্ন উপায়ে সর্ট করতে হয়। আপনি পারফরম্যান্স পার্থক্যও জানেছেন এবং কুইকসর্ট অ্যালগরিদম ইমপ্লিমেন্ট করা।

এখানে আপনার মনে রাখার বিষয়গুলো:

  • আপনি একটি অ্যারে, হ্যাশ, বা অন্য যেকোনো Enumerable অবজেক্টে sort মেথড ব্যবহার করতে পারেন এবং আপনি ডিফল্ট সর্টিং আচরণ পাবেন ( <=> অপারেটর বেজড সর্ট)
  • আপনি sort ব্লক দিয়ে ব্যবহার করতে পারেন, এবং দুটি ব্লক আর্গুমেন্ট, এক অবজেক্ট অন্যটির চেয়ে কীভাবে আলাদা তা সংজ্ঞায়িত করতে (ব্লকটি ১, ০, বা -১ রিটার্ন করা উচিত)
  • আপনি sort_by ব্লক দিয়ে ব্যবহার করতে পারেন, এবং একটি আর্গুমেন্ট, প্রতিটি অবজেক্টের জন্য একটি অ্যাট্রিবিউট সংজ্ঞায়িত করতে যা সর্টের ভিত্তি হিসেবে ব্যবহৃত হবে (অ্যারে দৈর্ঘ্য, অবজেক্ট অ্যাট্রিবিউট, ইন্ডেক্স, ইত্যাদি)। ব্লকটি একটি ইন্টিজার ভ্যালু রিটার্ন করা উচিত যা সর্ট করা অ্যারেতে অবজেক্টের পজিশন নির্ধারণ করবে।

আরো মানুষ শিখতে পারেন সেটি নিশ্চিত করতে এই পোস্ট শেয়ার করা না ভুলেন। 🙂


  1. রুবির grep মেথড মাস্টারিং: কোড উদাহরণসহ একটি ব্যবহারিক গাইড

  2. রুবির Map মেথড মাস্টারিং: উদাহরণসহ একটি ব্যবহারিক গাইড

  3. রুবিতে ফাইল পড়া এবং লেখা: একটি স্টেপ-বাই-স্টেপ গাইড

  4. রুবি অ্যারে 습득: প্র্যাক্টিক্যাল উদাহরণ এবং অপরিহার্য মেথডগুলো