Ruby - Array中的唯一元素

Pet*_*ker 33 ruby arrays

我有一个包含一些元素的数组.如何才能获得数组中每个元素的出现?

例:

鉴于:

a = ['cat', 'dog', 'fish', 'fish']
Run Code Online (Sandbox Code Playgroud)

结果:

a2 #=> {'cat' => 1, 'dog' => 1, 'fish' => 2}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Ram*_*Vel 41

你可以Enumerable#group_by用来做这件事

res = Hash[a.group_by {|x| x}.map {|k,v| [k,v.count]}]
#=> {"cat"=>1, "dog"=>1, "fish"=>2}
Run Code Online (Sandbox Code Playgroud)


小智 23

a2 = a.reduce(Hash.new(0)) { |a, b| a[b] += 1; a }
#=> {"cat"=>1, "fish"=>2, "dog"=>1}
Run Code Online (Sandbox Code Playgroud)

  • 使用默认预设值的`Hash.new(0)`很好用! (2认同)

u2i*_*2ix 9

a2 = {}
a.uniq.each{|e| a2[e]= a.count(e)}
Run Code Online (Sandbox Code Playgroud)


Mic*_*ohl 8

在1.9.2中你可以这样做,根据我的经验,很多人发现each_with_objectreduce/inject(至少知道它的人)更具可读性:

a = ['cat','dog','fish','fish']
#=> ["cat", "dog", "fish", "fish"]

a2 = a.each_with_object(Hash.new(0)) { |animal, hash| hash[animal] += 1 }
#=> {"cat"=>1, "dog"=>1, "fish"=>2}
Run Code Online (Sandbox Code Playgroud)


Sha*_*han 6

Ruby 2.7为此提供了Tally方法。

理货?a_hash

统计集合,即计算每个元素的出现次数。返回一个散列,其中集合的元素作为键,相应的计数作为值。

['cat', 'dog', 'fish', 'fish'].tally  

=> {"cat"=>1, "dog"=>1, "fish"=>2}
Run Code Online (Sandbox Code Playgroud)


the*_*fme 3

m = {}

a.each do |e|
  m[e] = 0 if m[e].nil?
  m[e] = m[e] + 1
end

puts m
Run Code Online (Sandbox Code Playgroud)