我有一个数组,它看起来像这样:[7, 2, 3, 2, 2, 1]
。正如您所看到的,此数组中有三个元素,其整数值为2.我想获取此数组并创建一个如下所示的索引:{ 1 => 1, 2 => 3, 3 => 1, 4 => 0, 5 => 0, 6 => 0, 7 => 1 }
所以,基本上是数组中有多少重复项的条形图/直方图/索引。
只是为了高级别的观点。我正在尝试在我的应用程序中找到每个帐户的所有唯一电子邮件。
答案 0 :(得分:3)
a = [7, 2, 3, 2, 2, 1]
1.upto(a.max).each_with_object({}) {|number, hash| hash[number] = a.count(number)}
#=> {1=>1, 2=>3, 3=>1, 4=>0, 5=>0, 6=>0, 7=>1}
答案 1 :(得分:1)
此变体应该比其他答案快得多,并适用于任何阵列:
def histogram(array)
array.each_with_object( Hash.new(0) ){|number, count| count[number] += 1 }
end
array = [7, 2, 3, 2, 2, 1, 'a', 'b', 'c', 'b']
p freq = histogram(array)
#=> {7=>1, 2=>3, 3=>1, 1=>1, "a"=>1, "b"=>2, "c"=>1}
p array.select{|number| freq[number] == 1}
#=> [7, 3, 1, "a", "c"]
如果我理解你的问题,如果你想要做的就是找到只出现一次的元素,你就不需要哈希中的4 => 0, 5 => 0, 6 => 0
部分。
如果你想获得它,信息就在这里:
p freq[6]
#=> 0
如果您的数组来自ActiveRecord的数据库,最好直接使用SQL查询查找唯一元素,而不是检索所有元素并对其应用逻辑。
答案 2 :(得分:0)
arr = [8, 3, 4, 3, 3, 2]
min, max = arr.minmax
#=> [2, 8]
arr.each_with_object((min..max).to_a.product([0]).to_h) { |n,h| h[n] += 1 }
#=> {2=>1, 3=>3, 4=>1, 5=>0, 6=>0, 7=>0, 8=>1}
注意:
(min..max).to_a.product([0]).to_h
#=> {2=>0, 3=>0, 4=>0, 5=>0, 6=>0, 7=>0, 8=>0}