找出哪个对象在ruby中有n个实例

找出哪个对象在ruby中有n个实例,ruby,arrays,find,instance,Ruby,Arrays,Find,Instance,我有一个数组:x=[a,b,c,d,e,f,g,h],它可以有1到9个对象 首先,我要数一数这些物体是否出现了3次。我不想写 if (x.count(1) == 3) or (x.count(2) == 3) ...etc... 有没有办法缩短这个时间,如下面所示 x.count { |obj| obj } == 3 第二,如果我知道一个对象被发现有3个实例,我如何才能找出它是哪一个?(1或2或3…) 这是怎么回事?让我们按照步骤来做。首先,让我们按计数对项目进行分组: grouped

我有一个数组:x=[a,b,c,d,e,f,g,h],它可以有1到9个对象

首先,我要数一数这些物体是否出现了3次。我不想写

if (x.count(1) == 3) or (x.count(2) == 3) ...etc... 
有没有办法缩短这个时间,如下面所示

x.count { |obj| obj } == 3 
第二,如果我知道一个对象被发现有3个实例,我如何才能找出它是哪一个?(1或2或3…)


这是怎么回事?让我们按照步骤来做。首先,让我们按计数对项目进行分组:

grouped_by_count = x.group_by do |e|
  x.count(e)
end
这将生成一个散列,其中键为计数,值为具有该计数的非唯一项的列表:

p grouped_by_count
#=> {1=>[:a], 3=>[:b, :b, :b, :c, :c, :c]}
不过,我们更希望有独特的商品,所以让我们进行转换:

grouped_by_count_unique = grouped_by_count.map do |count, items|
  [count, items.uniq]
end
p grouped_by_count_unique
#=> [[1, [:a]], [3, [:b, :c]]]
这给了我们一个数组,而不是散列。幸运的是,很容易将数组数组转换为哈希:

counted = Hash[grouped_by_count_unique]
p counted
# => {1=>[:a], 3=>[:b, :c]}

现在,只需将这些部分放在一起,去掉临时部分,就可以在顶部找到答案。

太棒了,谢谢,它也非常优雅!我会好好考虑的。
counted = Hash[grouped_by_count_unique]
p counted
# => {1=>[:a], 3=>[:b, :c]}