Arrays 数组中相同元素的数目
我的目标是显示数组中相同元素的数量 这是我的密码:Arrays 数组中相同元素的数目,arrays,ruby,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 输出未命中1 a = [5,2,4,1,2] b = a.uniq for i in b print i," appears ",a.count(i)," ti
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
输出未命中1
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]
这里有一种不同的方法,假设我理解“it”是什么(计算数组中的元素):
Hash.new(0)
使用默认值0
初始化哈希。我们迭代a
(同时将散列作为附加对象传递),因此元素
将是a
的每个元素,而计数器
将是我们的散列。我们将元素索引的哈希值增加1;在每个元素的第一步中,都不会有任何内容,但是我们的默认值保存了培根(0+1是1)。下次我们遇到一个元素时,它将增加该索引下散列中已经存在的任何值
在获得元素及其计数的散列后,我们可以打印它们,当然,put
与print
相同,但会自动插入一个换行符;使用字符串插值语法(“…{…}…)
,将值直接放入打印的字符串本身,而不是使用逗号打印多个内容,这会更好
代码中的问题如下所示:
- [logic]
中的i将为您提供
的元素,而不是索引。因此,a
将为第一个元素提供a[i]
,而不是nil
,因为5
在列表之外。这就是输出中缺少a[5]
的原因:1
(即a[1]
)在您尝试处理它时已经在2
中b
- [样式]
中,几乎从未在Ruby代码中看到过,对用于。。。在…
和每个
可枚举模块的其他方法都有强烈的偏好
- [performance]
在循环中增加了算法的复杂性:a.count(i)
本身必须看到整个数组,您需要迭代数组才能看到count
,对于大型数组,这将以指数级速度减慢。上面的方法只有一个循环,因为对散列的访问非常快,因此或多或少会随着数组的大小线性增长i
当然,风格和性能问题是次要的;在需要处理非常大的数组之前,您不会看到性能下降,并且样式错误不会使代码无法工作;然而,如果你在学习露比,你应该从一开始就用语言来学习,去习惯它的习语,因为它会给你提供比其他语言成语更强大的基础。你的问题也缺少一个问题。请说明您想要什么样的输出,以及您得到的输出与之有何不同。还有,你为什么“好奇这样解决问题”?即使这种方法被证明是完全错误的,你还会“好奇地想用这种方法解决它”吗?(我还没有说这是错误的,因为我不知道你在试图做什么——但这肯定是不受质疑的)我同意阿马丹的观点。你说“用这种方法解决”,但“用这种方法”不行。那现在怎么办?现在还不清楚你的问题有什么意义。什么构成了同样有效的“这种方式”?如果有效,就不是“这种方式”——除非你更准确地说明“这种方式”的含义。如果“这个程序的目的是显示每个元素重复了多少次”,那么任何可行的方法都应该是可以接受的。我想得到的是-你想要的输出是什么<代码>[nil,4,2]看起来不像“数组中元素的重复次数”。
b
应该是什么?此外,您的错误很可能是因为误解了i
中的而不是中的i,因为您可能不会编写a[i]
;但是对于。。。in…
从来没有被Ruby程序员使用过,如果你在书中看到它,最好是烧掉它。我的主要抱怨是关于StackOverflow的问题必须是问题。初学者的疑问是受欢迎的,但知道如何提问对于获得好答案至关重要。“你应该使用每一个而不是,因为
中的…是我试图帮助你在Ruby中的未来的一部分;“您应该在您的问题中提供尽可能多的信息”是我试图帮助您解决堆栈溢出问题的一部分。为什么或为什么您如此匆忙地选择提供的第一个答案?快速选择可能会阻碍其他答案,并且不会给那些正在研究答案的人足够的时间在获得选中标记之前完成。不用着急。这里的许多人至少要等上几个小时,有些要等更长的时间。顺便说一句,如果出现更好的答案,您可以随时取消选中标记或更改选择。这是非常低效的,因为a
对b
的每个元素都迭代一次。其他方法(参见我对问题的评论)执行一次a
。另外,i
对于变量名来说是一个糟糕的选择,因为它通常用于引用索引。我知道OP错误地认为它是一个索引,但这不是不改变它的理由。谢谢你的建议!因为他没有把它放在上下文中,所以我不太关心OOP。我只是想纠正他的解决方案。另外,for语句就像一个测试来显示结果。
5 appears 1 times
2 appears 2 times
4 appears 1 times
1 appears 1 times
[5, 2, 4, 1]
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