উত্তর:
পরিবর্তে বাছাই_আমি ব্যবহার করার পরামর্শ দিই:
objects.sort_by {|obj| obj.attribute}
বিশেষত যদি গুণটি গণনা করা যেতে পারে।
বা আরও সংক্ষিপ্ত পদ্ধতির:
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!(উদাহরণস্বরূপ গতি ইত্যাদি) সাথে কীভাবে তুলনা করা যায় কোনও ধারণা ?
হ্যাঁ, এটি ব্যবহার Array#sort!করা সহজ।
myarray.sort! { |a, b| a.attribute <=> b.attribute }
<=>? আপনি কি ধরণের ত্রুটি পাচ্ছেন? ইত্যাদি, ইত্যাদি। অন্য কথায়, "তবে আমার পক্ষে ভাগ্য নেই" এর চেয়ে আমাদের আরও বিশদ প্রয়োজন।
sortআপনি যদি আসলটি সংরক্ষণ করতে চান এবং ফলাফলটি অন্য কোনও অবজেক্টকে অর্পণ করতে চান তবে ব্যবহার করুন ; অন্যথায়, ইন-প্লেস ভেরিয়েন্ট ব্যবহার করুন sort!। প্রকৃতপক্ষে, আসল অবজেক্টটি অনুলিপি করার পরে, অভ্যন্তরীণভাবে sortকল করে sort!।
sort!ঠিক কাজ করবে এবং সর্বদা (!) আপনি যা লিখেছেন ঠিক একই কাজ করবেন।
আপনার যদি দুটি বৈশিষ্ট্য অনুসারে বাছাই করা প্রয়োজন, যেখানে প্রথমটি প্রথমে আরও গুরুত্বপূর্ণ তখন দ্বিতীয় (অর্থাত প্রথম যুক্তি সমান হলে কেবল দ্বিতীয় আর্গুমেন্ট গ্রহণ করা), তবে আপনি এটি পছন্দ করতে পারেন
myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
বা অ্যারে অ্যারের ক্ষেত্রে
myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }
<=> পদ্ধতিটি ওভাররাইড করে আপনি যে কোনও শ্রেণিকে বাছাইযোগ্য করতে পারেন:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(other)
@last_name + @first_name <=> other.last_name + other.first_name
end
end
এখন ব্যক্তির অবজেক্টগুলির একটি অ্যারে লাস্ট_নেমে বাছাইযোগ্য হবে।
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
অ্যারে # সাজানোর কাজ উপরের পোস্ট হিসাবে ভাল কাজ করে:
myarray.sort! { |a, b| a.attribute <=> b.attribute }
কিন্তু, আপনাকে নিশ্চিত করতে হবে যে <=>অপারেটরটি সেই গুণটির জন্য কার্যকর করা হয়েছে। যদি এটি রুবি নেটিভ ডেটা টাইপ হয় তবে এটি কোনও সমস্যা নয়। অন্যথায়, আপনার নিজের প্রয়োগটি লিখুন যা কোনও <b, 0 সমান হলে 0 এবং a> খ যদি 1 আসে তবে returns
আরও মার্জিত objects.sort_by(&:attribute), আপনার .reverseযদি অর্ডারটি স্যুইচ করা দরকার হয় তবে আপনি যোগ করতে পারেন ।
@model_name.sort! { |a,b| a.attribute <=> b.attribute }
sortযখন সরাসরি তুলনা করা যায় না এমন বস্তু বাছাই করার সময় ব্যবহার করবেন না । ব্যবহারের তুলনায় মানটি পেতে যদি আপনাকে অ্যাট্রিবিউটগুলি অ্যাক্সেস করতে হয় বা কোনও গণনা করতে হয় sort_by। এটি আরও দ্রুত হবে।
objects.sort_by(&:attribute)