Comment compter les doublons dans les matrices Ruby

Comment comptez-vous les doublons dans un rubis tableau?

Par exemple, si mon tableau a trois a, comment pourrais-je compter que

31
demandé sur Keng 2009-11-19 21:10:30

13 réponses

Cela donnera les éléments dupliqués comme un hachage avec le nombre d'occurences pour chaque élément dupliqué. Laissez-le code de parler:

#!/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}
28
répondu miku 2016-08-12 14:49:38

une Autre version d'un hash avec une clé pour chaque élément de votre tableau et la valeur pour le compte de chaque élément

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 } 
52
répondu Kim 2009-11-19 19:12:41

étant donné:

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

ma façon préférée de compter les éléments est:

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

# => [[1, 1], [2, 2], [3, 2], [4, 1], [5, 1]]

si vous avez besoin d'un hachage au lieu d'un tableau:

Hash[*counts.flatten]

# => {1=>1, 2=>2, 3=>2, 4=>1, 5=>1}
32
répondu Ibrahim Muhammad 2012-11-22 20:30:26

Simple.

arr = [2,3,4,3,2,67,2]
repeats = arr.length - arr.uniq.length
puts repeats
14
répondu JRL 2009-11-19 18:38:50
arr = %w( a b c d c b a )
# => ["a", "b", "c", "d", "c", "b", "a"]

arr.count('a')
# => 2
12
répondu colllin 2013-04-27 23:53:46

une Autre façon de calculer la matrice de doublons est:

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

arr.group_by{|x| x}.map{|k,v| [k,v.count] }

le résultat est

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

11
répondu Ganesh Shrivas 2015-05-06 08:08:26

nécessite 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"]

avec 1.9+ cela peut être légèrement simplifié car # select retournera un hachage.

ary.group_by{|elem| elem}.select{|key,val| val.length > 1}.keys
# => ["a", "b"]
7
répondu glenn jackman 2010-01-06 20:34:08

Pour compter les occurrences d'un même élément ont injecter

array.inject(0){|count,elem| elem == value ? count+1 : count}
3
répondu Chris 2009-12-15 21:00:07

Qu'un grep?

arr = [1, 2, "Thanks", "You're welcome", "Thanks", "You're welcome", "Thanks", "You're welcome"]

arr.grep('Thanks').size # => 3
3
répondu fro_oo 2013-03-14 19:58:55

Je ne pense pas qu'il y ait une méthode intégrée. Si vous avez besoin d' total nombre de copies, Vous pouvez prendre un.longueur-A. uniq.longueur. Si vous cherchez le nombre d'un élément particulier, essayez

a.select {|e| e == my_element}.length.

2
répondu Thom Smith 2015-05-06 08:09:24

améliorer la réponse de @Kim:

arr = [1, 2, "a", "a", 4, "a", 2, 1]
Hash.new(0).tap { |h| arr.each { |v| h[v] += 1 } }
# => {1=>2, 2=>2, "a"=>3, 4=>1}
2
répondu Cristiano Mendonça 2016-01-27 22:02:09

Facile:

words = ["aa","bb","cc","bb","bb","cc"]

Une ligne solution est simple:

words.each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }

ça marche pour moi.

Merci!!

1
répondu Manish Shrivastava 2014-05-28 11:31:57

j'ai utilisé reduce/inject pour cela dans le passé, comme le suivant

array = [1,5,4,3,1,5,6,8,8,8,9]
array.reduce (Hash.new(0)) {|counts, el| counts[el]+=1; counts}

produit

=> {1=>2, 5=>2, 4=>1, 3=>1, 6=>1, 8=>3, 9=>1}
0
répondu rewolf 2016-11-02 06:17:58