রুবিতে অবজেক্টের অ্যাট্রিবিউট দ্বারা একটি অ্যারে বাছাই করা হচ্ছে?


128

আমার কাছে রবি অন রেলে আইটেমের একটি অ্যারে রয়েছে। আমি বস্তুর একটি বৈশিষ্ট্য দ্বারা অ্যারে বাছাই করতে চাই। এটা কি সম্ভব?

উত্তর:


222

পরিবর্তে বাছাই_আমি ব্যবহার করার পরামর্শ দিই:

objects.sort_by {|obj| obj.attribute}

বিশেষত যদি গুণটি গণনা করা যেতে পারে।

বা আরও সংক্ষিপ্ত পদ্ধতির:

objects.sort_by(&:attribute)

81
বা শর্টহ্যান্ড সংস্করণ:objects.sort_by(&:attribute)
নিকোলা


1
আপনার যদি বড় হাতের অক্ষর এবং ছোট হাতের অক্ষরগুলি আলাদাভাবে বাছাই করার সমস্যা হয় তবে আপনি ব্যবহার করতে পারেনobjects.sort_by { |obj| obj.attribute.downcase }
ক্যাম্পিটারসন

1
এটির sort!(উদাহরণস্বরূপ গতি ইত্যাদি) সাথে কীভাবে তুলনা করা যায় কোনও ধারণা ?
জোশুয়া পিন্টার


35

হ্যাঁ, এটি ব্যবহার Array#sort!করা সহজ।

myarray.sort! { |a, b|  a.attribute <=> b.attribute }

Thnx বন্ধু কিন্তু এটি আমার জন্য কার্যকর হয়নি আমার কাছে একটি অ্যারে অবজেক্ট রয়েছে। যার মধ্যে অবজেক্টের একটি অন্যতম বৈশিষ্ট্য তৈরি হয়_আট। আমি এই ক্ষেত্রের সাথে এটি বাছাই করতে চাই। সুতরাং আমি @ Comm_bytes.sort করেছিলাম! {| ক, খ | a.created_at <=> বি ক্রিয়েটেড_এটি} তবে আমার জন্য ভাগ্য আপনার সাহায্য করতে পারে না .... ??

4
@ ক্রিয়েটেড_এটি অ্যাট্রিবিউট অ্যাক্সেস করার জন্য কি কোনও তৈরি_আট পদ্ধতি আছে? @ ক্রিয়েটেড_্যাট কোন ধরণের অবজেক্ট? এটি কি সংজ্ঞা দেয় <=>? আপনি কি ধরণের ত্রুটি পাচ্ছেন? ইত্যাদি, ইত্যাদি। অন্য কথায়, "তবে আমার পক্ষে ভাগ্য নেই" এর চেয়ে আমাদের আরও বিশদ প্রয়োজন।
রাউমিয়ান

যদি আপনি ম্যারি = myarray.sort {...} "ছাড়া" করেন তবে এটি কাজ করে!
ডোরুচিডিয়ান

@ দুরু হ্যাঁ, এটি খুব কার্যকর হয় তবে আপনি কেন এটি করবেন? এটি কম প্রত্যক্ষ এবং কম দক্ষ। sortআপনি যদি আসলটি সংরক্ষণ করতে চান এবং ফলাফলটি অন্য কোনও অবজেক্টকে অর্পণ করতে চান তবে ব্যবহার করুন ; অন্যথায়, ইন-প্লেস ভেরিয়েন্ট ব্যবহার করুন sort!। প্রকৃতপক্ষে, আসল অবজেক্টটি অনুলিপি করার পরে, অভ্যন্তরীণভাবে sortকল করে sort!
কনরাড রুডল্ফ

1
@ ডোরু কোডটিতে অন্য কোথাও একটি ত্রুটি থাকতে হবে, আমি আপনাকে 100% গ্যারান্টি দিতে পারি যা sort!ঠিক কাজ করবে এবং সর্বদা (!) আপনি যা লিখেছেন ঠিক একই কাজ করবেন।
কনরাড রুডল্ফ

27

উর্দ্ধক্রমানুসারে :

objects_array.sort! { |a, b|  a.attribute <=> b.attribute }

অথবা

objects_array.sort_by{ |obj| obj.attribute }

অবতরণ ক্রম:

objects_array.sort! { |a, b|  b.attribute <=> a.attribute }

অথবা

objects_array.sort_by{ |obj| obj.attribute }.reverse

20

আপনার যদি দুটি বৈশিষ্ট্য অনুসারে বাছাই করা প্রয়োজন, যেখানে প্রথমটি প্রথমে আরও গুরুত্বপূর্ণ তখন দ্বিতীয় (অর্থাত প্রথম যুক্তি সমান হলে কেবল দ্বিতীয় আর্গুমেন্ট গ্রহণ করা), তবে আপনি এটি পছন্দ করতে পারেন

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] }

14

<=> পদ্ধতিটি ওভাররাইড করে আপনি যে কোনও শ্রেণিকে বাছাইযোগ্য করতে পারেন:

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" ]

10

অ্যারে # সাজানোর কাজ উপরের পোস্ট হিসাবে ভাল কাজ করে:

myarray.sort! { |a, b|  a.attribute <=> b.attribute }

কিন্তু, আপনাকে নিশ্চিত করতে হবে যে <=>অপারেটরটি সেই গুণটির জন্য কার্যকর করা হয়েছে। যদি এটি রুবি নেটিভ ডেটা টাইপ হয় তবে এটি কোনও সমস্যা নয়। অন্যথায়, আপনার নিজের প্রয়োগটি লিখুন যা কোনও <b, 0 সমান হলে 0 এবং a> খ যদি 1 আসে তবে returns


10

আরও মার্জিত objects.sort_by(&:attribute), আপনার .reverseযদি অর্ডারটি স্যুইচ করা দরকার হয় তবে আপনি যোগ করতে পারেন ।



-2
@model_name.sort! { |a,b| a.attribute <=> b.attribute }

2
২০০৯-এ প্রচুর অভিন্ন উত্তর পোস্ট করা হয়েছে another আর একটি যুক্ত করার দরকার নেই।
ইন্টারজয়

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