返回数组中匹配元素的列表索引

时间:2017-01-14 17:14:37

标签: ruby-on-rails arrays ruby

我有一个数组,它看起来像这样:[7, 2, 3, 2, 2, 1]。正如您所看到的,此数组中有三个元素,其整数值为2.我想获取此数组并创建一个如下所示的索引:{ 1 => 1, 2 => 3, 3 => 1, 4 => 0, 5 => 0, 6 => 0, 7 => 1 }

所以,基本上是数组中有多少重复项的条形图/直方图/索引。

只是为了高级别的观点。我正在尝试在我的应用程序中找到每个帐户的所有唯一电子邮件。

3 个答案:

答案 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"]

注释

element => 0

如果我理解你的问题,如果你想要做的就是找到只出现一次的元素,你就不需要哈希中的4 => 0, 5 => 0, 6 => 0部分。

如果你想获得它,信息就在这里:

p freq[6]
#=> 0

SQL?

如果您的数组来自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}
相关问题