أبسط كود لفرز المصفوفات في روبي؟
سؤال
وأنا عادة لا شيء من هذا القبيل
array.sort{|a,b| a.something <=> b.something}
وكيف يجب أن جفف هذا؟
المحلول
واستخدام sort_by
وarray.sort_by{|e| e.something}
أو
sort_lambda = lambda{|e| e.something}
array.sort_by(&sort_lambda)
مع هذا الأخير يمكنك إعادة sort_lambda في تصريحات sort_by أخرى
نصائح أخرى
في القضبان، أو بالأحرى مع ActiveSupport، أو في روبي 1.9 (ربما 1.8.7، ولست متأكدا) يمكنك استخدام قطع قصيرة جديدة تكون السبب:
array.sort_by(&:something)
لاحظ أن sort_by
ديه ربما باهظة الثمن (وربما من المفيد: ذلك يعتمد على نوع الرئيسية تعقيد) الآثار الجانبية: فهو يولد ويخزن زوج المفاتيح ذات قيمة مؤقت لكل عنصر بحيث يمكن فرز بواسطة المفتاح الجديد. انظر المناقشة في في وثائق للحصول على مزيد من المعلومات حول هذا الأمر.
و+1 لكلا من الاقتراحات Eimantas، لكني غالبا ما يكون هذا الخروج في الحالات التي يكون فيها لدي فئة مخصصة أن <م> دائما م> أنواع بهذه الطريقة، مثل الالبومات التي يجب فرز لا تتأثر بحالة الأحرف، وتجاهل الرائدة علامات الترقيم و/ أ / و. لذلك استخدام انها اكثر كفاءة لحساب قيمة النوع مرة واحدة، ومن ثم إعادة تعريف <=> وفقا لذلك. منها مثلا:
class Album
def sort_value
@sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"")
end
def <=>(other)
sort_value <=> (other.sort_value rescue other)
end
end
هل تعتبر بما في ذلك للمقارنة في فئة أ و ب، وفقط يدعو النوع؟