我的目标是显示数组中相同元素的数量。
这是我的代码:
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
。
答案 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)。下次我们遇到一个元素时,它会增加该索引下哈希中已存在的任何值。
获取元素及其计数的哈希后,我们可以打印它们,当然,puts
与print
相同,但会自动插入换行符;而不是使用逗号来打印几个东西,使用字符串插值语法("...#{...}...")
将值直接放入打印字符串本身更好。
代码中的问题如下:
for i in a
将为您提供a
的元素,而不是索引。因此,a[i]
会为您提供nil
第一个元素,而不是5
,因为a[5]
位于列表之外。这就是您的输出中缺少1
的原因:a[1]
(即2
)在您尝试处理b
时已经在for ... in ...
。each
在Ruby代码中几乎从未见过,强烈偏好Enumerable
以及a.count(i)
模块的其他方法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]