module Nuggets::Array::MedianMixin
Public Instance Methods
median([prefer]) → anObject
click to toggle source
median { |left, right| ... } → anObject
Determines the median of the values in array. array must be sortable.
If array contains an even number of values, a block may be passed to decide what the “middle” (average) should be. For Numeric
values, the block is optional and the arithmetic mean will be used when no block is passed; for other values, the block is mandatory.
Alternatively, prefer
may either be set to true
, 1, or :left
to use the left “middle”, or to false
, 2, or :right
to use the right “middle”. The block will then be ignored.
# File lib/nuggets/array/median_mixin.rb 46 def median(prefer = nil) 47 return if empty? 48 49 sorted, index = sort, (size / 2.0).ceil - 1 50 51 case prefer 52 when true, 1, :left then prefer_left = true 53 when false, 2, :right then prefer_right = true 54 end 55 56 middle1 = sorted[index] 57 return middle1 if prefer_left || size.odd? 58 59 middle2 = sorted[index + 1] 60 return middle2 if prefer_right 61 62 unless block_given? 63 # simple arithmetic mean 64 (middle1 + middle2) / 2.0 65 else 66 # make your own average 67 yield middle1, middle2 68 end 69 end