如何计算Ruby数组中的重复项

33 ruby arrays duplicate-data count

你如何计算ruby数组中的重复项?

例如,如果我的数组有三个a,我怎么能算这个

Kim*_*Kim 55

另一个版本的哈希,其中包含数组中每个元素的键和每个元素的计数值

a = [ 1, 2, 3, 3, 4, 3]
h = Hash.new(0)
a.each { | v | h.store(v, h[v]+1) }

# h = { 3=>3, 2=>1, 1=>1, 4=>1 } 
Run Code Online (Sandbox Code Playgroud)

  • +1.更优雅 - "a.each {| v | h [v] + = 1}` (27认同)
  • 作为一个单行:`[1,2,3,3,4,3] .reduce(Hash.new(0)){| h,v | h.store(v,h [v] + 1); h}`.`#increration'通常比用于填充一个新变量的`#each`更受欢迎. (4认同)

Ibr*_*mad 33

鉴于:

arr = [ 1, 2, 3, 2, 4, 5, 3]
Run Code Online (Sandbox Code Playgroud)

我最喜欢的计算元素的方法是:

counts = arr.group_by{|i| i}.map{|k,v| [k, v.count] }

# => [[1, 1], [2, 2], [3, 2], [4, 1], [5, 1]]
Run Code Online (Sandbox Code Playgroud)

如果您需要哈希而不是数组:

Hash[*counts.flatten]

# => {1=>1, 2=>2, 3=>2, 4=>1, 5=>1}
Run Code Online (Sandbox Code Playgroud)


mik*_*iku 26

这将生成重复元素作为散列,其中包含每个重复项的出现次数.让代码说:

#!/usr/bin/env ruby

class Array
  # monkey-patched version
  def dup_hash
    inject(Hash.new(0)) { |h,e| h[e] += 1; h }.select { 
      |k,v| v > 1 }.inject({}) { |r, e| r[e.first] = e.last; r }
  end
end

# unmonkeey'd
def dup_hash(ary)
  ary.inject(Hash.new(0)) { |h,e| h[e] += 1; h }.select { 
    |_k,v| v > 1 }.inject({}) { |r, e| r[e.first] = e.last; r }
end

p dup_hash([1, 2, "a", "a", 4, "a", 2, 1])
# {"a"=>3, 1=>2, 2=>2}

p [1, 2, "Thanks", "You're welcome", "Thanks", 
  "You're welcome", "Thanks", "You're welcome"].dup_hash
# {"You're welcome"=>3, "Thanks"=>3}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.答案现在包括一个非猴子修补版本. (3认同)
  • 不再是-1,但是说真的......不要猴子补丁,除非没有其他方法可以做到这一点。 (2认同)

JRL*_*JRL 14

简单.

arr = [2,3,4,3,2,67,2]
repeats = arr.length - arr.uniq.length
puts repeats
Run Code Online (Sandbox Code Playgroud)


col*_*lin 13

arr = %w( a b c d c b a )
# => ["a", "b", "c", "d", "c", "b", "a"]

arr.count('a')
# => 2
Run Code Online (Sandbox Code Playgroud)

  • 这种方法是迄今为止最好的解决方案.这就是我们使用Ruby的原因! (5认同)

小智 11

计算数组重复的另一种方法是:

arr= [2,2,3,3,2,4,2]

arr.group_by{|x| x}.map{|k,v| [k,v.count] }
Run Code Online (Sandbox Code Playgroud)

结果是

[[2,4],[3,2],[4,1]]


gle*_*man 7

要求1.8.7+ group_by

ary = %w{a b c d a e f g a h i b}
ary.group_by{|elem| elem}.select{|key,val| val.length > 1}.map{|key,val| key}
# => ["a", "b"]
Run Code Online (Sandbox Code Playgroud)

使用1.9+可以略微简化,因为Hash #select会返回一个哈希值.

ary.group_by{|elem| elem}.select{|key,val| val.length > 1}.keys
# => ["a", "b"]
Run Code Online (Sandbox Code Playgroud)