如何在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。你的问题为时过早。你需要尝试,然后问一个关于你尝试了什么的具体问题。请阅读“包括链接页面和”。如果您不介意的话,我建议我们应该在回答中采用良好的编程技术。压痕就是其中之一。天知道它在调试程序时有多大帮助。事实上,我正在尝试添加缩进!但它不起作用:/。但我同意:)