我有一个数组a = [1, 2, 2, 4]
如何在数组中找到相同元素的数量?
例如,数组中有两个“2”,我该如何找到?
我希望输出像
There are 2 "2" in array.
答案 0 :(得分:2)
获得许多非uniq元素:
a.size - a.uniq.size
#=> 1
获取非uniq元素的计数:
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.
答案 1 :(得分:1)
你可以试试这个:
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}
答案 2 :(得分: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}
答案 3 :(得分: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}
答案 4 :(得分:1)
您尝试的是类似于频率分布,即您希望获得每个数字或对象出现在数组中的次数。
您可以使用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}
以下是另一种方法:
$scope.data = {};
$scope.data.displayBean = {};
$scope.fetchEventDetails = function() {
$http.get('http://localhost:8080/api/v1/event_details?eventId=' + $scope.data.selectedEventId)
.then(function(theEvent){
$scope.data.displayBean = theEvent.data;
});
}
如需进一步阅读,请参阅" Building a Histogram"。
答案 5 :(得分:1)
我建议你使用计数哈希。有关默认值为零的情况,请参阅Hash::new。
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"