如何计算 Ruby 数组中相同字符串元素的数量
我有以下 Array = ["Jason", "Jason", "Teresa", "Judah", "Michelle", "Judah", "Judah", "Allison"]
我该如何生成每个相同元素的计数?
Where:
"Jason" = 2, "Judah" = 3, "Allison" = 1, "Teresa" = 1, "Michelle" = 1?
或生成哈希 地点:
地点: 哈希 = {“杰森”=>; 2、“犹大”=> 3、《艾莉森》=> 1、“特蕾莎”=> 1、“米歇尔”=> 1 }
I have the following Array = ["Jason", "Jason", "Teresa", "Judah", "Michelle", "Judah", "Judah", "Allison"]
How do I produce a count for each identical element?
Where:
"Jason" = 2, "Judah" = 3, "Allison" = 1, "Teresa" = 1, "Michelle" = 1?
or produce a hash Where:
Where:
hash = { "Jason" => 2, "Judah" => 3, "Allison" => 1, "Teresa" => 1, "Michelle" => 1 }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
Ruby v2.7+(最新)
从 ruby v2.7.0(2019 年 12 月发布)开始,核心语言现在包括
Enumerable#tally
- 一个 新方法,专门针对此问题设计:Ruby v2.4+(EOL ruby 版本,但在较新版本上仍然有效的代码)
当第一次提出此问题时(2011 年 2 月),以下代码在标准 ruby 中是不可能的),因为它使用:
Object#itself
< /a>,已添加到 Ruby v2.2.0(2014 年 12 月发布)中。Hash#transform_values
,这是添加到 Ruby v2.4.0(2016 年 12 月发布)。这些对 Ruby 的现代补充支持以下实现:
Ruby v2.2+(EOL ruby 版本,但在较新版本上仍然有效代码)
对于更旧的 ruby 版本,无法访问上述
Hash#transform_values
方法,您可以使用Array#to_h
< /a>,已添加到 Ruby v2.1.0(2013 年 12 月发布)中:对于甚至更旧的 ruby 版本 (
<= 2.1
),有多种方法可以解决这个,但是(在我看来)没有明确的“最佳”方法。请参阅这篇文章的其他答案。Ruby v2.7+ (latest)
As of ruby v2.7.0 (released December 2019), the core language now includes
Enumerable#tally
- a new method, designed specifically for this problem:Ruby v2.4+ (EOL ruby version, but still valid code on newer versions)
The following code was not possible in standard ruby when this question was first asked (February 2011), as it uses:
Object#itself
, which was added to Ruby v2.2.0 (released December 2014).Hash#transform_values
, which was added to Ruby v2.4.0 (released December 2016).These modern additions to Ruby enable the following implementation:
Ruby v2.2+ (EOL ruby version, but still valid code on newer versions)
For even older ruby versions, without access to the above mentioned
Hash#transform_values
method, you could instead useArray#to_h
, which was added to Ruby v2.1.0 (released December 2013):For even older ruby versions (
<= 2.1
), there are several ways to solve this, but (in my opinion) there is no clear-cut "best" way. See the other answers to this post.给你
gives you
现在使用 Ruby 2.2.0,您可以利用
本身
方法。Now using Ruby 2.2.0 you can leverage the
itself
method.Ruby 2.7+
Ruby 2.7 为此引入了
Enumerable#tally
。 这里有一个很好的总结。在此用例中:
有关正在发布的功能的文档为 这里。
Ruby 2.7+
Ruby 2.7 is introducing
Enumerable#tally
for this exact purpose. There's a good summary here.In this use case:
Docs on the features being released are here.
实际上有一个数据结构可以做到这一点:
MultiSet
。不幸的是,Ruby 核心库或标准库中没有 MultiSet 实现,但网络上有一些实现。
这是一个很好的例子,说明了数据结构的选择如何简化算法。事实上,在这个特定的例子中,算法甚至完全消失了。从字面上看就是:
就是这样。示例,使用 https://GitHub.Com/Josh/Multimap/:
示例,使用 http://maraigue.hhiro.net/multiset/index-en.php:
There's actually a data structure which does this:
MultiSet
.Unfortunately, there is no
MultiSet
implementation in the Ruby core library or standard library, but there are a couple of implementations floating around the web.This is a great example of how the choice of a data structure can simplify an algorithm. In fact, in this particular example, the algorithm even completely goes away. It's literally just:
And that's it. Example, using https://GitHub.Com/Josh/Multimap/:
Example, using http://maraigue.hhiro.net/multiset/index-en.php:
Enumberable#each_with_object
可以帮助您避免返回最终的哈希值。返回:
Enumberable#each_with_object
saves you from returning the final hash.Returns:
这有效。
This works.
以下是一种稍微更实用的编程风格:
group_by
的一个优点是您可以使用它对等效但不完全相同的项目进行分组:The following is a slightly more functional programming style:
One advantage of
group_by
is that you can use it to group equivalent but not exactly identical items:信用弗兰克·瓦姆布特
Credit Frank Wambutt
这里有很多很棒的实现。
但作为初学者,我认为这是最容易阅读和实现的
我们采取的步骤:
names
数组上循环的names
数组中,name
创建了一个键,并使用count
创建了一个值。将会使用覆盖键做一些不必要的工作),但在我看来更容易阅读和理解你想要实现的目标
Lots of great implementations here.
But as a beginner I would consider this the easiest to read and implement
The steps we took:
names
arraynames
arrayname
and a value using thecount
It may be slightly more verbose (and performance wise you will be doing some unnecessary work with overriding keys), but in my opinion easier to read and understand for what you want to achieve
使用 ruby 2.6,您可以:
为您提供:
With ruby 2.6 you can do:
gives you:
这更像是一条评论,而不是一个答案,但评论并不能公正地表达它。如果您执行
Array = foo
,则至少会导致 IRB 的一个实现崩溃:这是因为
Array
是一个类。This is more a comment than an answer, but a comment wouldn't do it justice. If you do
Array = foo
, you crash at least one implementation of IRB:That's because
Array
is a class.有趣的是,时间流逝了 0.028 毫秒
,stupidgeek 的实现进行了基准测试:
时间流逝了 0.041 毫秒
,获胜答案:
时间流逝了 0.011 毫秒
:)
Time elapsed 0.028 milliseconds
interestingly, stupidgeek's implementation benchmarked:
Time elapsed 0.041 milliseconds
and the winning answer:
Time elapsed 0.011 milliseconds
:)