Ruby 以10为增量从1到100对数组中的整数进行计数

Ruby 以10为增量从1到100对数组中的整数进行计数,ruby,Ruby,因此,这一切的最终结果如下所示 puts "#" * b 每个#代表有多少1-10个 1-10 ######################### 11-20 ############################## 21-30 ###################### 编辑:或者更简单,通过利用一个简单的数学特性: counts = 10.times.map { |i| (i + 1)...(i + 11) }.map { |range| a.count { |x| range

因此,这一切的最终结果如下所示

puts "#" * b
每个#代表有多少1-10个

1-10 #########################
11-20 ##############################
21-30 ######################
编辑:或者更简单,通过利用一个简单的数学特性:

counts = 10.times.map { |i| (i + 1)...(i + 11) }.map { |range|
  a.count { |x| range.include? x }
}

counts[0]
# => 17   (number of numbers in 1...11)
counts[1]
# => 20   (number of numbers in 11...21)
counts[2]
# => 22   (number of numbers in 21...31)
# ...
希望每个10(1-10、11-20等)都有一个不同的变量,我可以稍后调用

如果可以使用数组,为什么需要不同的变量

EDIT2:整个程序,1-4行:

counts = a.group_by { |x| (x - 1) / 10 }.map { |k, v| v.count }
翻译:进行两百次迭代,构造一个数组,使每个元素都是1到100之间的随机数。然后根据除以10的结果对数组进行分组(调整1,这样我们就不会得到0-9、10-19……)的范围;在包含除法结果和项目的哈希上迭代,打印边界(从除法结果重构开始和结束)以及与每个组中的项目数相对应的哈希数

EDIT3:正如Stefan所指出的,我们可以使用
chunk
,因为数组是经过排序的,这样可以有一点加速<上面的代码>分组依据不关心正在排序的数组。您可以简单地用
chunk
替换
group\u,即使它们返回不同的类型,因为在哈希上迭代的方式与在两个元素数组的数组上迭代的方式相同

array = 200.times.map { rand(1..100) }.sort
array.group_by { |x| (x - 1) / 10 }.each do |k, v|
  puts "%2d-%2d %s" % [k * 10 + 1, k * 10 + 10, "#" * v.count]
end
编辑:或者更简单,通过利用一个简单的数学特性:

counts = 10.times.map { |i| (i + 1)...(i + 11) }.map { |range|
  a.count { |x| range.include? x }
}

counts[0]
# => 17   (number of numbers in 1...11)
counts[1]
# => 20   (number of numbers in 11...21)
counts[2]
# => 22   (number of numbers in 21...31)
# ...
希望每个10(1-10、11-20等)都有一个不同的变量,我可以稍后调用

如果可以使用数组,为什么需要不同的变量

EDIT2:整个程序,1-4行:

counts = a.group_by { |x| (x - 1) / 10 }.map { |k, v| v.count }
翻译:进行两百次迭代,构造一个数组,使每个元素都是1到100之间的随机数。然后根据除以10的结果对数组进行分组(调整1,这样我们就不会得到0-9、10-19……)的范围;在包含除法结果和项目的哈希上迭代,打印边界(从除法结果重构开始和结束)以及与每个组中的项目数相对应的哈希数

EDIT3:正如Stefan所指出的,我们可以使用
chunk
,因为数组是经过排序的,这样可以有一点加速<上面的代码>分组依据
不关心正在排序的数组。您可以简单地用
chunk
替换
group\u,即使它们返回不同的类型,因为在哈希上迭代的方式与在两个元素数组的数组上迭代的方式相同

array = 200.times.map { rand(1..100) }.sort
array.group_by { |x| (x - 1) / 10 }.each do |k, v|
  puts "%2d-%2d %s" % [k * 10 + 1, k * 10 + 10, "#" * v.count]
end
我建议使用计数散列

注意

(a = (Array.new(20){|x| x=(rand(1..100)) })).sort!
  #=> [3, 12, 17, 17, 20, 31, 32, 43, 47, 50, 62, 65, 70, 83, 87, 89, 92, 94, 97, 98] 

g = a.each_with_object(Hash.new(0)) do |n,h|
  interval_first = 1+10*((n-1)/10)
  h[interval_first..interval_first+9] += 1
end
  #=> {1..10=>1, 11..20=>4, 31..40=>2, 41..50=>3, 61..70=>3, 81..90=>3, 91..100=>4}
即使
g
没有键
21..30
51..60

如果将值为零的间隔包括在
g
中,这是一种方法:

g[21..30] #=> 0
g[51..60] #=> 0

请注意,使用此方法对随机数数组进行预排序没有任何好处。这可能适用于大多数人可能会考虑的方法。

< P>我建议使用计数哈希。< /P> 注意

(a = (Array.new(20){|x| x=(rand(1..100)) })).sort!
  #=> [3, 12, 17, 17, 20, 31, 32, 43, 47, 50, 62, 65, 70, 83, 87, 89, 92, 94, 97, 98] 

g = a.each_with_object(Hash.new(0)) do |n,h|
  interval_first = 1+10*((n-1)/10)
  h[interval_first..interval_first+9] += 1
end
  #=> {1..10=>1, 11..20=>4, 31..40=>2, 41..50=>3, 61..70=>3, 81..90=>3, 91..100=>4}
即使
g
没有键
21..30
51..60

如果将值为零的间隔包括在
g
中,这是一种方法:

g[21..30] #=> 0
g[51..60] #=> 0



请注意,使用此方法对随机数数组进行预排序没有任何好处。这可能是真实的,大多数人可能会考虑。

这是普通的Ruby,而Ruby on Rails标签绝对不相关。这是普通的Ruby,Ruby on Rails标签绝对不相关。B=A.计数{C C(C>20和C<31)} B=A.计数{C C(C>20和C<31)} CRAP,我不能键入一个空间。无论如何。我想制作一个变量,这样我就可以用一个变量来做一个简单的函数,变量的大小是1-10,比如puts“#”*b因为数组已经排序了,你也可以使用
chunk
而不是
groupby
。如果你已经使用了chunk/groupby
(x-1)/10*10+1
,你可以将你的输出缩短到
[k,k+9]。“*v.count]
b=a.count{c|(c>20&&c<31)}b=a.count{c|(c>20&&c<31)}废话,我不能键入空格。。无论如何。我想制作一个变量,这样我就可以用一个变量来做一个简单的函数,变量的大小是1-10,比如puts“#”*b因为数组已经排序了,你也可以使用
chunk
而不是
groupby
。如果你已经使用了chunk/groupby
(x-1)/10*10+1
,你可以将你的输出缩短到
[k,k+9]。“*v.count]
这有一个缺点,即每10个间隔遍历一次随机数列表。@CarySwoveland实际上,这仍然是线性的(假设范围的数量是恒定的)。(:虽然此代码片段可能会解决问题,但它不会解释为什么或如何回答问题。请注意,这确实有助于提高您的文章质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。标记者/审阅者:这有d每10个间隔遍历一次随机数列表的好处。@CarySwoveland实际上,这仍然是线性的(假设范围的数量是恒定的)。(:虽然此代码片段可能会解决此问题,但它不会解释为什么或如何回答此问题。请注意,这确实有助于提高您文章的质量。请记住,您是在为将来的读者回答此问题,而这些人可能不知道您提出代码建议的原因。标记者/审阅者:哈希确实知道不一定包含所有范围。谢谢@Stefan。你会看到我做了一个编辑来解决这个问题(实际上在我看到你的评论之前)。顺便说一句,你错过了我犯的一个小错误。我很失望。我的浓缩咖啡机还在加热☕️散列不一定包含所有范围。谢谢@Stefan。你会看到我做了一个编辑来解决这个问题(实际上在我看到你的评论之前)。顺便说一句,你错过了我犯的一个小错误。我很失望。我的浓缩咖啡机还在加热☕️