如何在Fixnums ruby​​数组中查找特定整数的数量

时间:2014-04-03 01:31:29

标签: ruby arrays integer normalization

我现在正在做一个练习,我正在寻找阵列中的所有零。

输入是:

numbers = [1, 3, 500, 200, 4000, 3000, 10000, 90, 20, 500000]

我希望按零的数量将它们排序为哈希值。预期的输出是:

expected = {0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000], 1=>[90, 20], 5=>[500000]}

我已经构建了结构,但我不确定如何计算零的数量:

grouped = Hash.new {|hash, key| hash[key] = []}
numbers.each do |num|
  grouped[num] << num
end


为了清晰起见,已编辑: 任何意见,将不胜感激。此外,我读到的很多建议都建议将整数数组转换为字符串以解决问题。有没有办法计算数字的数量(不只是零)而不将数组转换为字符串?在这种情况下的预期输出看起来像:

expected = {1=>[1, 3], 2=>[90, 20], 3=>[500, 200], 4=>[4000, 3000], 5=>[10000], 6=>[500000]

提前致谢。

4 个答案:

答案 0 :(得分:1)

像许多你想要做的变换一样,这个变换在Enumerable中找到。

按位数分组:

grouped = numbers.group_by { |n| Math.log10(n).to_i + 1 }
# => {1=>[1, 3], 3=>[500, 200], 4=>[4000, 3000], 5=>[10000], 2=>[90, 20], 6=>[500000]}

按零数分组:

grouped = numbers.group_by { |n| n.to_s.match(/0+$/) ? $&.length : 0 }
# => {0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000], 1=>[90, 20], 5=>[500000]}

group_by方法是一种将数组转换为哈希的方便方法,其中包含组织成鸽笼的内容。

答案 1 :(得分:1)

我结束了

grouped = Hash.new {|hash, key| hash[key] = []}
numbers.each do |num|
  grouped[num.to_s.count('0')] << num
end

但我真的很喜欢回复的变化。我没有意识到有很多方法可以解决这个问题。谢谢大家。

答案 2 :(得分:0)

按日志分组10?

1.9.3-p484 :014 > numbers.each {|n| grouped[Math.log10(n).floor] << n}
 => [1, 3, 500, 200, 4000, 3000, 10000, 90, 20, 500000] 
1.9.3-p484 :016 > grouped   
 => {0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000], 1=>[90, 20], 5=>[500000]} 

如果您需要将密钥作为实际位数,请尝试1 + Math.log10(n).floor

答案 3 :(得分:0)

如果您希望按照它们包含的零位数对非负整数进行分组,您可以这样做:

def nbr_zeroes(n)
  return 1 if n == 0
  m = n
  i = 0
  while m > 0
    i += 1 if m % 10 == 0
    m /= 10
  end
  i
end

numbers = [1, 3, 500, 200, 4000, 3000, 10000, 90, 20, 500000]
numbers.group_by { |i| nbr_zeroes(i) }
  #=> { 0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000] }

numbers = [100000, 100001, 304070, 3500040, 314073, 2000, 314873, 0]
numbers.group_by { |i| nbr_zeroes(i) }
  #=> { 5=>[100000],    4=>[100001, 3500040], 3=>[304070, 2000],
  #     1=>[314073, 0], 0=>[314873] }