如何计算 Ruby 数组中相同字符串元素的数量

2024-01-02

我有以下内容Array = ["Jason", "Jason", "Teresa", "Judah", "Michelle", "Judah", "Judah", "Allison"]

我如何为每个生成一个计数相同的元素?

Where:
"Jason" = 2, "Judah" = 3, "Allison" = 1, "Teresa" = 1, "Michelle" = 1?

or 产生一个哈希值 Where:

在哪里: 哈希= {“杰森”=> 2,“犹大”=> 3,“艾莉森”=> 1,“特蕾莎”=> 1,“米歇尔”=> 1 }


Ruby v2.7+(最新)

从 ruby​​ v2.7.0(2019 年 12 月发布)开始,核心语言现在包括Enumerable#tally https://ruby-doc.org/core/Enumerable.html#method-i-tally - a 新方法 https://github.com/ruby/ruby/commit/673dc51c251588be3c9f4b5b5486cd80d46dfeee,专门针对这个问题设计:

names = ["Jason", "Jason", "Teresa", "Judah", "Michelle", "Judah", "Judah", "Allison"]

names.tally
#=> {"Jason"=>2, "Teresa"=>1, "Judah"=>3, "Michelle"=>1, "Allison"=>1}

Ruby v2.4+(EOL ruby​​ 版本,但在较新版本上仍然有效代码)

当第一次提出这个问题时(2011 年 2 月),以下代码在标准 ruby​​ 中是不可能的,因为它使用:

  • Object#itself https://ruby-doc.org/core/Object.html#method-i-itself,已添加到 Ruby v2.2.0(2014 年 12 月发布)中。
  • Hash#transform_values http://ruby-doc.org/core/Hash.html#method-i-transform_values,已添加到 Ruby v2.4.0(2016 年 12 月发布)中。

Ruby 的这些现代附加功能支持以下实现:

names = ["Jason", "Jason", "Teresa", "Judah", "Michelle", "Judah", "Judah", "Allison"]

names.group_by(&:itself).transform_values(&:count)
#=> {"Jason"=>2, "Teresa"=>1, "Judah"=>3, "Michelle"=>1, "Allison"=>1}

Ruby v2.2+(EOL ruby​​ 版本,但在较新版本上仍然有效代码)

对于更旧的 ruby​​ 版本,无法访问上述内容Hash#transform_values方法,你可以改用Array#to_h https://ruby-doc.org/core/Array.html#method-i-to_h,已添加到 Ruby v2.1.0(2013 年 12 月发布)中:

names.group_by(&:itself).map { |k,v| [k, v.length] }.to_h
#=> {"Jason"=>2, "Teresa"=>1, "Judah"=>3, "Michelle"=>1, "Allison"=>1}

For 甚至更老红宝石版本(<= 2.1),有几种方法可以解决这个问题,但是(在我看来)没有明确的“最佳”方法。请参阅这篇文章的其他答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算 Ruby 数组中相同字符串元素的数量 的相关文章

随机推荐