التابع Enumerable.max_by في روبي

من موسوعة حسوب

يعيد التابع max_by العنصر الذي تعيد الكتلة المعطاة أكبر قيمة مقابلة له بعد تمرير عناصر الكائن القابل للتعداد إليها كلٌّ على حدة.

إن لم تعطَ أية كتلة، فسيعيد التابع كائنًا من النوع Enumerator.

البنية العامة

max_by {|obj| block }  obj
max_by  an_enumerator
max_by(n) {|obj| block }  obj
max_by(n)  an_enumerator

المعاملات

n

إن أعطي هذا المعامل، فسيُعاد أكبر n عنصر في مصفوفة. تُرتَّب العناصر آنذاك في المصفوفة بشكل تنازلي بناءً على القيمة المقابلة التي تعيدها الكتلة.

القيمة المعادة

يعاد العنصر الذي تعيد الكتلة المعطاة أكبر قيمة مقابلة له بعد تمرير عناصر الكائن القابل للتعداد إليها كلٌّ على حدة، أو أكبر n عنصر إن أعطي هذا المعامل. يعاد كائن من النوع Enumerator إن لم تُعطَ أية كتلة.

أمثلة

مثال على استعمال التابع max_by:

a = %w(albatross dog horse)
a.max_by { |x| x.length }   #=> "albatross"

إعادة المثال السابق ولكن مع تمرير المعامل n:

a = %w[albatross dog horse]
a.max_by(2) {|x| x.length } #=> ["albatross", "horse"]

يمكن استعمال التابع max_by(n)‎ لتنفيذ عينات عشوائية موزونة (weighted random sampling). المثال التالي، ينفِّذ ويستعمل التابع Enumerable.wsample:

module Enumerable
  # weighted random sampling.
  #
  # Pavlos S. Efraimidis, Paul G. Spirakis
  # Weighted random sampling with a reservoir
  # Information Processing Letters
  # Volume 97, Issue 5 (16 March 2006)
  def wsample(n)
    self.max_by(n) {|v| rand ** (1.0/yield(v)) }
  end
end
e = (-20..20).to_a*10000
a = e.wsample(20000) {|x|
  Math.exp(-(x/5.0)**2) # normal distribution
}
# a is 20000 samples from e.
p a.length #=> 20000
h = a.group_by {|x| x }
-10.upto(10) {|x| puts "*" * (h[x].length/30.0).to_i if h[x] }
#=> *
#   ***
#   ******
#   ***********
#   ******************
#   *****************************
#   *****************************************
#   ****************************************************
#   ***************************************************************
#   ********************************************************************
#   ***********************************************************************
#   ***********************************************************************
#   **************************************************************
#   ****************************************************
#   ***************************************
#   ***************************
#   ******************
#   ***********
#   *******
#   ***
#   *

انظر أيضًا

مصادر