Ruby - Array中的唯一元素

时间:2011-05-02 13:46:37

标签: ruby arrays

我有一个包含一些元素的数组。我怎样才能得到数组中每个元素的出现?

示例:

假设:

a = ['cat', 'dog', 'fish', 'fish']

结果:

a2 #=> {'cat' => 1, 'dog' => 1, 'fish' => 2}

我该怎么做?

12 个答案:

答案 0 :(得分:40)

您可以使用Enumerable#group_by执行此操作

res = Hash[a.group_by {|x| x}.map {|k,v| [k,v.count]}]
#=> {"cat"=>1, "dog"=>1, "fish"=>2}

答案 1 :(得分:22)

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

答案 2 :(得分:8)

a2 = {}
a.uniq.each{|e| a2[e]= a.count(e)}

答案 3 :(得分:6)

在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}

答案 4 :(得分:4)

使用array的count方法来计算。

a.count('cat')

答案 5 :(得分:4)

Ruby 2.7为此具有tally方法。

计数→a_hash

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

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

=> {"cat"=>1, "dog"=>1, "fish"=>2}

答案 6 :(得分:2)

m = {}

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

puts m

答案 7 :(得分:2)

a.inject({}){|h, e| h[e] = h[e].to_i+1; h }
#=> {"cat"=>1, "fish"=>2, "dog"=>1}

或n2解决方案

a.uniq.inject({}){|h, e| h[e] = a.count(e); h }
#=> {"cat"=>1, "fish"=>2, "dog"=>1}

答案 8 :(得分:2)

a = ['cat','dog','fish','fish']
a2 = Hash[a.uniq.map {|i| [i, a.count(i)]}]

答案 9 :(得分:1)

a = ['cat','dog','fish','fish']
a2 = Hash.new(0)
a.each do |e|
    a2[e] += 1
end
a2

答案 10 :(得分:1)

['cat','dog','fish','fish'].group_by(&:itself).transform_values(&:count)
=> {
     "cat" => 1,
     "dog" => 1,
    "fish" => 2
}

答案 11 :(得分:0)

ruby​​ fu!

count = Hash[Hash[rows.group_by{|x| x}.map {|k,v| [k, v.count]}].sort_by{|k,v| v}.reverse]