如何在ruby语言中查找数组中相同元素的数量

时间:2016-10-31 12:08:35

标签: ruby

我有一个数组a = [1, 2, 2, 4] 如何在数组中找到相同元素的数量? 例如,数组中有两个“2”,我该如何找到? 我希望输出像

There are 2 "2" in array.

6 个答案:

答案 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"