Как считать дубликаты в Массивах Ruby

Этот код тестируется и поддерживает много опций.

Больше здесь: http://code.msdn.microsoft.com/TheNotifyIconExample

33
задан Keng 25 November 2009 в 04:15
поделиться

6 ответов

Это даст повторяющиеся элементы в виде хеша с количеством вхождений для каждого повторяющегося элемента. Пусть код говорит:

#!/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}
26
ответ дан 27 November 2019 в 17:21
поделиться

требует 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"]

с 1.9+, это можно немного упростить, потому что Hash # select вернет хэш.

ary.group_by{|elem| elem}.select{|key,val| val.length > 1}.keys
# => ["a", "b"]
7
ответ дан 27 November 2019 в 17:21
поделиться

Простой.

arr = [2,3,4,3,2,67,2]
repeats = arr.length - arr.uniq.length
puts repeats
14
ответ дан 27 November 2019 в 17:21
поделиться

Другая версия хэша с ключом для каждого элемента в вашем массиве и значением для счетчика каждого элемента

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 } 
55
ответ дан 27 November 2019 в 17:21
поделиться

Я не думаю, что есть встроенный метод. Если все, что вам нужно, это общее количество дубликатов, вы можете взять a.length - a.uniq.length. Если вы ищете количество отдельного элемента, попробуйте
a.select {| e | e == my_element} .length .

2
ответ дан 27 November 2019 в 17:21
поделиться

Для подсчета экземпляров одного элемента используйте инжектор

array.inject(0){|count,elem| elem == value ? count+1 : count}
3
ответ дан 27 November 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: