数组中相同元素的数量

时间:2018-01-24 03:13:01

标签: arrays ruby

我的目标是显示数组中相同元素的数量。

这是我的代码:

a = [5, 2, 4, 1, 2]
b = []
for i in a
  unless b.include?(a[i])
    b << a[i]
    print i," appears ",a.count(i)," times\n"
  end
end

我得到了这个输出:

5 appears 1 times
2 appears 2 times
4 appears 1 times

输出未命中1

2 个答案:

答案 0 :(得分:3)

这是一种不同的方式,假设我明白了什么&#34;它&#34;是(计算数组中的元素):

a = [5,2,4,1,2]
counts = a.each_with_object(Hash.new(0)) do |element, counter|
  counter[element] += 1
end
# => {5=>1, 2=>2, 4=>1, 1=>1}
# i.e. one 5, two 2s, one 4, one 1.
counts.each do |element, count|
  puts "#{element} appears #{count} times"
end
# => 5 appears 1 times
# => 2 appears 2 times
# => 4 appears 1 times
# => 1 appears 1 times

Hash.new(0)使用默认值0初始化哈希。我们迭代a(同时将散列作为附加对象传递),因此element将按顺序成为a的每个元素,counter将成为我们的散列。我们将元素索引的哈希值递增1;在第一次使用每个元素时,不会有任何东西,但我们的默认值保存我们的培根(0 + 1为1)。下次我们遇到一个元素时,它会增加该索引下哈希中已存在的任何值。

获取元素及其计数的哈希后,我们可以打印它们,当然,putsprint相同,但会自动插入换行符;而不是使用逗号来打印几个东西,使用字符串插值语法("...#{...}...")将值直接放入打印字符串本身更好。

代码中的问题如下:

  • [逻辑] for i in a将为您提供a的元素,而不是索引。因此,a[i]会为您提供nil第一个元素,而不是5,因为a[5]位于列表之外。这就是您的输出中缺少1的原因:a[1](即2)在您尝试处理b时已经在for ... in ...
  • [style] each在Ruby代码中几乎从未见过,强烈偏好Enumerable以及a.count(i)模块的其他方法
  • 循环中的
  • [performance] count会增加算法的复杂性:i本身必须查看整个数组,并且需要迭代数组以查看re.split(r'(\\.*[\s$])', markup) ,这将是巨大阵列呈指数级增长。上面的方法只有一个循环,因为对哈希的访问非常快,因此随着数组的大小或多或少线性增长。

当然,风格和表现问题都很小;你不会看到性能下降,直到你需要处理真正大的数组,样式错误不会使你的代码无法工作;但是,如果您正在学习Ruby,那么您应该从一开始就习惯使用该语言,以便随时习惯它的习语,因为它将为您提供比移植其他语言更强大的基础。就成了它。

答案 1 :(得分:2)

a = [5,2,4,1,2]
b = a.uniq

for i in b
  print i," appears ",a.count(i)," times\n"
end
print b

结果:

5 appears 1 times
2 appears 2 times
4 appears 1 times
1 appears 1 times
[5, 2, 4, 1]