如何在ruby语言中找到数组中相同元素的数目

如何在ruby语言中找到数组中相同元素的数目,ruby,Ruby,我有一个数组a=[1,2,2,4] 如何在数组中找到重复元素的数量? 例如,整数“2”在数组中出现两次,我如何才能找到它? 我想要像这样的输出 There are 2 "2" in array. 要获取大量非uniq元素,请执行以下操作: a.size - a.uniq.size #=> 1 a.chunk(&:itself).reject { |chunk| chunk.last.one? }.flat_map(&:last).size #=> 2 要获取非u

我有一个数组
a=[1,2,2,4]
如何在数组中找到重复元素的数量? 例如,整数“2”在数组中出现两次,我如何才能找到它? 我想要像这样的输出

There are 2 "2" in array.

要获取大量非uniq元素,请执行以下操作:

a.size - a.uniq.size
#=> 1
a.chunk(&:itself).reject { |chunk| chunk.last.one? }.flat_map(&:last).size
#=> 2
要获取非uniq元素的计数,请执行以下操作:

a.size - a.uniq.size
#=> 1
a.chunk(&:itself).reject { |chunk| chunk.last.one? }.flat_map(&:last).size
#=> 2

根据编辑后的问题:

'There are ' + a.chunk(&:itself).reject { |chunk| chunk.last.one? }.map {|chunk| "#{chunk.last.size} \"#{chunk.first}\"" }.join(' and ') + 'in array.'
#=> "There are 2 "2" in array."
如果存在更多重复条目:

a = [1,1,2,2,3,3,3,4]
输出如下所示:

There are 2 "1" and 2 "2" and 3 "3"in array.
您可以尝试以下方法:

a = [1, 2, 2, 4,2]
count={}
a.each do |element|
  if (count[element]==nil)
    count[element]=1
  else
    count[element]+=1
  end
end
puts count
输出为:

{1=>1, 2=>3, 4=>1}

使其比@SoulRebel短一点:

a = [1, 2, 2, 4,2]
count = {}
a.each { |e| count[e] == nil ? count[e] = 1 : count[e] += 1 }
puts count
输出也很简单

{1=>1, 2=>3, 4=>1}

这将返回每个元素的计数:

a = [1, 2, 2, 4]
a.group_by { |number| number }.map { |key, value| [key, value.size] }.to_h
#=> {1=>1, 2=>2, 4=>1}
或更短:

a.map { |num| [num, a.count(num)] }.uniq.to_h
#=> {1=>1, 2=>2, 4=>1}

您所尝试的类似于频率分布,即,您希望获得每个数字或对象在数组中出现的次数

您可以使用
group_by
为您执行以下操作:

a = [1,2,2,4]
# Use group_by to calculate frequency distribution

freq_dist = a.group_by { |el| el } # Returns a hash
# freq_dist = {1=>[1], 2=>[2, 2], 4=>[4]}

# To calcualte no of times 2 is repeated 
puts freq_dist[2].count
您还可以使用一些数组实用程序编写自己的方法。 首先获取所有唯一元素,并将其映射到数组中元素的重复次数:

a = [1,2,2,4]

# Get unique elements using uniq and map each element to it's count

a.uniq.reduce({}) { |result,el| result[el] = a.count el ; result }

# Gives {1=>1, 2=>2, 4=>1}
下面是另一种方法:

# This uses memoization 
a.inject({}) { |res,el| res[el] += 1; res}

有关进一步阅读,请参阅“

我建议您使用计数散列。有关默认值为零的情况,请参见

a = [2,5,3,2,5,5]

s = a.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }.
      reject { |_,v| v==1 }.
      map { |cnt, nbr| "#{nbr} #{cnt}" }.join(', ')
puts "There are #{s} in array"
印刷品

There are 2 2, 3 5 in array
计算
s
的步骤如下

b = a.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
  #=> {2=>2, 5=>3, 3=>1} 
c = b.reject { |_,v| v==1 }
  #=> {2=>2, 5=>3} 
d = c.map { |cnt, nbr| "#{nbr} #{cnt}" }
  #=> ["2 2", "3 5"] 
s = d.join(', ')
  #=> "2 2, 3 5" 

什么意思?请更好地解释并提供输入和输出示例。如果
a=['w','x','y','y','z','z']
,您希望结果是什么<代码>2<代码>3<代码>{1=>['w',x'],2=>['y'],3=>['z']}?请在提问时尽量说得更具体些。对于一个糟糕的书面问题,我很抱歉,我要紧急离开。@KirillZhuravlov我已根据所需的输出编辑了答案欢迎访问Stack Overflow。你的问题为时过早。你需要尝试,然后问一个关于你尝试了什么的具体问题。请阅读“包括链接页面和”。如果您不介意的话,我建议我们应该在回答中采用良好的编程技术。压痕就是其中之一。天知道它在调试程序时有多大帮助。事实上,我正在尝试添加缩进!但它不起作用:/。但我同意:)