ruby - 查找最接近数组平均值的元素

标签 ruby arrays algorithm average

执行以下操作的“ ruby ”方式是什么?我仍然在思考更多的命令式编程,并没有真正适应 ruby​​ 的思考。我想要做的是找到大小最接近数组平均值的元素,例如,考虑以下数组

[1,2,3] 

平均值为 2.0。我要编写的方法返回从其上方和下方最接近平均值的元素,在本例中为 1 和 3。

另一个例子可以更好地说明这一点:

[10,20,50,33,22] avg is 27.0 method would return 22 and 33.

最佳答案

这不是最有效的,但(以我的拙见)它很像 Ruby。

class Array
  # Return the single element in the array closest to the average value
  def closest_to_average
    avg = inject(0.0,:+) / length
    min_by{ |v| (v-avg).abs }
  end
end

[1,2,3].closest_to_average
#=> 2 

[10,20,50,33,22].closest_to_average
#=> 22 

如果你真的想要 n 个最接近的项目,那么:

class Array
  # Return a number of elements in the array closest to the average value
  def closest_to_average(results=1)
    avg = inject(0.0,:+) / length
    sort_by{ |v| (v-avg).abs }[0,results]
  end
end

[10,20,50,33,22].closest_to_average     #=> [22] 
[10,20,50,33,22].closest_to_average(2)  #=> [22, 33] 
[10,20,50,33,22].closest_to_average(3)  #=> [22, 33, 20] 

这是如何运作的

avg = inject(0.0,:+)/length
是以下内容的简写:
avg = self.inject(0.0){ |sum,n| sum+n }/self.length
我从 0.0 而不是 0 的值开始,以确保总和将是一个 float ,因此除以长度不会给我一个整数-舍入值。

排序依据{ |v| (v-avg).abs
根据数字和平均值之间的差异(从最低到最高)对数组进行排序,然后:
[0,结果]
从该数组中选择第一个 results 个条目。

关于ruby - 查找最接近数组平均值的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22086311/

相关文章:

Ruby Tempfile - 修改文件名?

javascript - JS 将单个索引中的 2 个数组及其各个值合并到 1 个数组中的单个索引中

php - 当数据库中的变量为 null 或为空时显示 "Not Provided"

c - 如何防止字符指针缓冲区溢出?

ruby - 将我的博主博客导入 Jekyll

ruby - 向类添加可枚举功能及更多功能

ruby - 如何使用传递到 Graphql ruby​​ 字段的参数来转换结果?

algorithm - 在 3D 空间中追踪 2D 多边形 - 合适的算法?

algorithm - 如何将数字编码为字符串,使生成的字符串的字典顺序与数字顺序相同

c++ - 二进制 GCD - 算法太慢