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

Ruby on rails 返回数组中匹配元素的列表索引,ruby-on-rails,arrays,ruby,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} 因此,基本上是一个条形图/柱状图/数组中有多少重复项的索引 只是为了从更高的角度来看这一点。我正在尝试在我的应用程序中查找每个帐户的所有唯一电子邮件。解决方案 a = [7, 2, 3, 2, 2, 1] 1.upto(a.max).each_with_object({})

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

因此,基本上是一个条形图/柱状图/数组中有多少重复项的索引

只是为了从更高的角度来看这一点。我正在尝试在我的应用程序中查找每个帐户的所有唯一电子邮件。

解决方案
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}
此变体应比其他答案快得多,并适用于任何阵列:

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"]
笔记 元素=>0 如果我正确理解了您的问题,那么如果您只想查找只出现一次的元素,则不需要哈希中的
4=>0,5=>0,6=>0
部分

但是,如果您想获取信息,请参见此处:

p freq[6]
#=> 0
SQL? 如果您的数组通过ActiveRecord来自数据库,那么最好使用SQL查询直接查找唯一的元素,而不是检索所有元素并对其应用逻辑。

解决方案
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}
此变体应比其他答案快得多,并适用于任何阵列:

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"]
笔记 元素=>0 如果我正确理解了您的问题,那么如果您只想查找只出现一次的元素,则不需要哈希中的
4=>0,5=>0,6=>0
部分

但是,如果您想获取信息,请参见此处:

p freq[6]
#=> 0
SQL? 如果您的数组通过ActiveRecord来自数据库,那么最好使用SQL查询直接查找唯一的元素,而不是检索所有元素并对其应用逻辑

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}
注:

注:


为数组或枚举数的每个元素调用
count
应该会发出警告铃(可能伴随着闪烁的消息,“低效!丑陋!”)。通常有两种方法只需要对数组进行一次遍历:构造一个计数哈希(
hash.new(0)
)或使用。@CarySwoveland一如既往,很好,我从一开始就想到了
groupby
,但它并不完全符合OP的需要。@Bitwise请参阅Cary的答案,以了解实现预期目标的更有效方法reslult@EricDuminil我说不上来,因为我不知道OP最终要实现什么目标。能够正确回答问题对于获得适当的帮助至关重要。我向OP展示了如何实现他所期望的结果。@AndreyDeineko:我同意这个问题有点令人困惑。“真正”的问题在最后一句IMHO(获取唯一的电子邮件地址)中,中间带示例的问题只是OP认为他可以解决最后一个问题的一种方式。为数组或枚举器的每个元素调用
count
应该会发出警告铃(可能伴随着闪烁的消息,“低效!丑陋!”)。通常有两种方法只需要对数组进行一次遍历:构造一个计数哈希(
hash.new(0)
)或使用。@CarySwoveland一如既往,很好,我从一开始就想到了
groupby
,但它并不完全符合OP的需要。@Bitwise请参阅Cary的答案,以了解实现预期目标的更有效方法reslult@EricDuminil我说不上来,因为我不知道OP最终要实现什么目标。能够正确回答问题对于获得适当的帮助至关重要。我向OP展示了如何实现他所期望的结果。@AndreyDeineko:我同意这个问题有点令人困惑。“真正”的问题出现在最后一句IMHO(获取唯一的电子邮件地址),中间带示例的问题只是OP认为他可以解决最后一个问题的一种方式。请注意,“真正”的问题是关于电子邮件地址的。对于
['a@a.com', 'z@z.com“]
,您的方法将创建11863801个数组!请注意,“真正”的问题是关于电子邮件地址的。对于
['a@a.com', 'z@z.com“]
,您的方法将创建11863801个数组!