রুবিতে একটি অ্যারে সাজানো সহজ!
আপনাকে কোন অভিনব অ্যালগরিদম লিখতে হবে না আপনি চান ফলাফল পেতে.
তাহলে কি দরকার?
রুবির অন্তর্নির্মিত সাজানোর পদ্ধতি বোঝা।
এইগুলি :
- বাছাই
- সর্ট_বাই
- বাছাই!
এই পদ্ধতিগুলি কীভাবে কাজ করে এবং কেন তারা আলাদা?
আপনি এই নিবন্ধে এটিই আবিষ্কার করবেন।
আপনি sort
দিয়ে শুরু করে অ্যারে সাজানোর বিভিন্ন উপায় শিখবেন পদ্ধতি, তারপর sort_by
দেখে নিন উন্নত সাজানোর জন্য (একাধিক মান দ্বারা) এবং আরও অনেক কিছু।
এটা করা যাক!
বাছাই এবং সাজানো ব্যবহার করতে শিখুন! রুবি পদ্ধতি
বাছাইয়ের সবচেয়ে মৌলিক রূপটি রুবি সাজানোর পদ্ধতি দ্বারা প্রদান করা হয়, যা গণনাযোগ্য মডিউল দ্বারা সংজ্ঞায়িত করা হয়।
একটি উদাহরণ দেখা যাক :
সংখ্যা =[5,3,2,1]numbers.sort# [1,2,3,5]
লক্ষ্য করুন যে sort
ফলাফল সহ একটি নতুন অ্যারে ফিরিয়ে দেবে৷
সাজানো উপাদানের একটি অ্যারে!
sort!
ব্যবহার করে "ইন-প্লেস" সাজানোও সম্ভব পদ্ধতি।
এর মানে হল আসল অ্যারে পরিবর্তন করবে একটি নতুন তৈরি করার পরিবর্তে, যা পারফরম্যান্সের জন্য ভাল হতে পারে।
সর্ট_বাই সহ কাস্টমাইজড বাছাই
sort_by
দিয়ে পদ্ধতি আপনি আরো উন্নত এবং আকর্ষণীয় বাছাই করতে পারেন.
আপনি করতে পারবেন :
- স্ট্রিং দৈর্ঘ্য অনুসারে সাজান
- স্ট্রিং বিষয়বস্তু অনুসারে সাজান
- সংখ্যা জোড় বা বিজোড় কিনা তা অনুসারে সাজান
আপনি sort_by
দিয়ে এটি করতে পারেন পদ্ধতি এবং একটি রুবি ব্লক।
উদাহরণস্বরূপ :
স্ট্রিংস =%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(" ")endsort_by_capital_word("ক্যালেন্ডার ক্যাট ট্যাপ ল্যাম্প")# "ক্যাট ল্যাম্প ক্যালেন্ডার ট্যাপ"
নিয়মিত sort
ব্যবহার করে কাস্টম বাছাই করাও সম্ভব ব্লক সহ পদ্ধতি।
এখানে একটি উদাহরণ আছে :
স্ট্রিংস =%w(foo পরীক্ষা ব্লগ a)strings.sort { |a,b| a.length <=> b.length }# ["a", "foo", "test", "blog"]
দ্রষ্টব্য :এই
<=>
প্রতীকটিকে "স্পেসশিপ অপারেটর" বলা হয় এবং এটি এমন একটি পদ্ধতি যা আপনি আপনার ক্লাসে প্রয়োগ করতে পারেন। এটি 1 (এর চেয়ে বড়), 0 (সমান) বা -1 (এর চেয়ে কম) প্রদান করবে।
সাধারণভাবে, আমি sort_by
পছন্দ করি পদ্ধতিটি কারণ উদ্দেশ্যটি আরও স্পষ্ট, এটি পড়া সহজ এবং এটি কিছুটা দ্রুত।
বিপরীত ক্রমে সাজান
বিপরীতে সাজানোর বিষয়ে কী?
আপনি reverse
ব্যবহার করতে পারেন বাছাই করার পরে পদ্ধতি, অথবা আপনি একটি ব্লক ব্যবহার করতে পারেন এবং আপনি যে জিনিসটি বাছাই করছেন তার সামনে একটি বিয়োগ চিহ্ন রাখতে পারেন৷
আমি আপনাকে একটি উদাহরণ দেখাই :
স্ট্রিংস =%w(foo টেস্ট ব্লগ a)strings.sort_by { |str| -str.length }# ["ব্লগ", "পরীক্ষা", "foo", "a"]
অভিনব নয়, কিন্তু এটা কাজ করে! 🙂
আলফানিউমেরিক বাছাই
ধরা যাক আপনি সংখ্যাগতভাবে স্ট্রিংগুলির একটি তালিকা বাছাই করতে চান যাতে সংখ্যা রয়েছে৷
৷এরকম :
সঙ্গীত =%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
)।
রুবিতে হ্যাশগুলি কীভাবে সাজানো যায়
আপনি অ্যারে সাজানোর মধ্যে সীমাবদ্ধ নন, আপনি একটি হ্যাশ বাছাই করতে পারেন।
উদাহরণ :
হ্যাশ ={নারকেল:200, কমলা:50, বেকন:100}hash.sort_by(&:last)# [[:orange, 50], [:bacon, 100], [:coconut, 200]]প্রে>এটি মান অনুসারে সাজানো হবে, তবে এখানে আকর্ষণীয় কিছু লক্ষ্য করুন, আপনি যা ফিরে পাবেন তা হ্যাশ নয়৷
একটি হ্যাশ বাছাই করার সময় আপনি একটি বহুমাত্রিক অ্যারে পাবেন৷
এটিকে হ্যাশে ফিরিয়ে আনতে আপনি Array#to_h পদ্ধতি ব্যবহার করতে পারেন।
একাধিক মান অনুসারে সাজানো
আপনি একাধিক বৈশিষ্ট্য দ্বারা কিছু বাছাই করতে চাইতে পারেন, যার অর্থ আপনি প্রথমে তারিখ অনুসারে বাছাই করেন (উদাহরণস্বরূপ), কিন্তু আপনার কাছে একই তারিখের একাধিক জিনিস থাকায় আপনার কাছে টাই আছে।
টাই ভাঙতে আপনি একটি গৌণ বৈশিষ্ট্য ব্যবহার করতে পারেন।
উদাহরণ :
ইভেন্ট =Struct.new(:name, :date)ইভেন্ট =[]ইভেন্টস <এখানে কী হল
sort_by
এর ভিতরে থাকা অ্যারে ব্লক।যেখানে আপনি অ্যারের প্রথম উপাদান হিসাবে প্রাথমিক সাজানোর বৈশিষ্ট্য সেট করেন (
event.date
) এবং তারপর সেকেন্ডারি টাই-ব্রেকার অ্যাট্রিবিউট (event.name
)।দ্রুত সাজানো বাস্তবায়ন
শুধু মজা করার জন্য আসুন আমাদের নিজস্ব সাজানোর পদ্ধতি প্রয়োগ করি। এটি অন্তর্নির্মিত সাজানোর পদ্ধতির চেয়ে ধীর হতে চলেছে, তবে আপনি যদি কম্পিউটার বিজ্ঞান পছন্দ করেন তবে এটি এখনও একটি আকর্ষণীয় অনুশীলন৷
def quick_sort(list) return [] if list.empty? group =list.group_by { |n| n <=> list.first } less_than =group[-1] || [] প্রথম =দলগুলি[0] || [] greater_ than =গোষ্ঠী[1] || [] quick_sort(less_than) + first + quick_sort(grater_than)endp quick_sort [3, 7, 2, 1, 8, 12]# [1, 2, 3, 7, 8, 12]দ্রুত সাজানোর ধারণা হল এলোমেলোভাবে একটি সংখ্যা বাছাই করা তারপর আমরা যে তালিকাটি বাছাই করছি তা দুটি গ্রুপে ভাগ করা।
একটি গ্রুপ হল নির্বাচিত সংখ্যা থেকে ছোট সংখ্যা এবং অন্য গ্রুপ হল নির্বাচিত সংখ্যার চেয়ে বড় সংখ্যা।
তারপর তালিকা সাজানো না হওয়া পর্যন্ত আমরা এই অপারেশনটি পুনরাবৃত্তি করি।
বেঞ্চমার্ক
চলুন দেখা যাক কিভাবে পারফরম্যান্সের দিক থেকে এই সমস্ত বাছাই পদ্ধতি একে অপরের সাথে তুলনা করে।
রুবি 2.4.0 :
সাজান!:1405.8 i/s বাছাই:1377.6 i/s - একই-ish:পার্থক্য ত্রুটির মধ্যে পড়ে i/s - ব্লক সহ 8.16x ধীর বাছাই:164.1 i/s - 8.57x ধীরআপনি দেখতে পাচ্ছেন, নিয়মিত
৷sort
পদ্ধতিsort_by
এর চেয়ে অনেক দ্রুত , কিন্তু আপনি একটি ব্লক ব্যবহার না করলে এটি ততটা নমনীয় নয়৷ভিডিও
সারাংশ
আপনি শিখেছেন কিভাবে
sort
ব্যবহার করতে হয় এবংsort_by
আপনার অ্যারে এবং হ্যাশগুলিকে বিভিন্ন উপায়ে সাজানোর পদ্ধতি। এছাড়াও আপনি পারফরম্যান্সের পার্থক্য এবং কিভাবে কুইকসর্ট অ্যালগরিদম বাস্তবায়ন করতে হয় সে সম্পর্কেও শিখেছেন।আপনার যা মনে রাখা উচিত তা এখানে রয়েছে :
- আপনি
sort
ব্যবহার করতে পারেন একটি অ্যারে, হ্যাশ বা অন্য গণনাযোগ্য বস্তুর পদ্ধতি এবং আপনি ডিফল্ট সাজানোর আচরণ পাবেন (<=>
এর উপর ভিত্তি করে সাজান অপারেটর)- আপনি
sort
ব্যবহার করতে পারেন একটি ব্লক এবং দুটি ব্লক আর্গুমেন্ট সহ, একটি বস্তু অন্যটির থেকে কীভাবে আলাদা তা নির্ধারণ করতে (ব্লকটি 1, 0, বা -1 প্রদান করা উচিত)- আপনি
sort_by
ব্যবহার করতে পারেন একটি ব্লক এবং একটি যুক্তি দিয়ে, প্রতিটি বস্তুর জন্য একটি বৈশিষ্ট্য নির্ধারণ করতে যা সাজানোর জন্য ভিত্তি হিসাবে ব্যবহার করা হবে (অ্যারের দৈর্ঘ্য, বস্তুর বৈশিষ্ট্য, সূচক, ইত্যাদি)। ব্লকটি একটি পূর্ণসংখ্যা মান প্রদান করবে যা সাজানো অ্যারেতে বস্তুর অবস্থান নির্ধারণ করে।এই পোস্টটি শেয়ার করতে ভুলবেন না যাতে আরো মানুষ শিখতে পারে। 🙂