Ruby 计算数组中的中值-有人能告诉我这行代码中发生了什么吗?

Ruby 计算数组中的中值-有人能告诉我这行代码中发生了什么吗?,ruby,median,Ruby,Median,这是一种用于计算数组中值的解决方案。我得到了前三行,duh;),但第三条线是魔法发生的地方。有人能解释一下“sorted”变量是如何使用的,为什么它在括号旁边,为什么另一个变量“len”被括在括号里,然后括在括号里?这几乎像是排序突然被用作数组?谢谢 def median(array) sorted = array.sort len = sorted.length return ((sorted[(len - 1) / 2] + sorted[len / 2]) /

这是一种用于计算数组中值的解决方案。我得到了前三行,duh;),但第三条线是魔法发生的地方。有人能解释一下“sorted”变量是如何使用的,为什么它在括号旁边,为什么另一个变量“len”被括在括号里,然后括在括号里?这几乎像是排序突然被用作数组?谢谢

  def median(array)
    sorted = array.sort
    len = sorted.length
    return ((sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0).to_f
  end

  puts median([3,2,3,8,91])
  puts median([2,8,3,11,-5])
  puts median([4,3,8,11])
考虑这一点:

[1,2,2,3,4]和[1,2,3,4]。这两个数组都已排序,但元素数分别为奇数和偶数。这段代码考虑了这两种情况


sorted
实际上是一个数组。对[2,3,1,4]进行排序,然后返回[1,2,3,4]。然后计算偶数/奇数个元素的中间索引
(len-1)/2
len/2
,并找到它们的平均值

是,array.sort正在返回一个数组,并将其分配给sorted。然后可以通过数组索引访问它

如果有奇数个元素,例如示例中的5个元素,则索引为:

(len-1)/2=(5-1)/2=2

len/2=5/2=2 --- (remember this is integer division, so the decimal gets truncated)
因此,取索引2处的值并将其相加,然后除以2,这与索引2处的值相同

如果有偶数个元素,比如说4

(len-1)/2=(4-1)/2=1 --- (remember this is integer division, so the decimal gets truncated)

len/2=4/2=2
因此,在这种情况下,有效地平均两个中间元素1和2,这是当元素数为偶数时的中值定义

这几乎像是排序突然被用作数组


是的。在第2行,它被初始化为一个数组,具有与输入相同的元素,但按升序排列(默认排序为升序)。第3行有
len
,它是用
sorted
数组的长度初始化的,所以是的,
sorted
从那时起就被用作数组,因为它就是这样。

中位数只是排序数组的“中间”元素,因此排序。正如本杰明所说,“中间”元素是位于“len/2”-th位置的元素。但是,我不明白,如果索引不是整数,会发生什么情况,这必须发生在sorted[(len-1)/2]或sorted[len/2]中。谢谢!非常有用。谢谢你的例子。我有点不清楚索引组件是否被视为数组参数,以及是否可以在数组中存储几乎任何对象。非常感谢。