Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算Ruby数组中的重复项_Ruby_Arrays_Count_Duplicate Data - Fatal编程技术网

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

如何计算Ruby数组中的重复项,ruby,arrays,count,duplicate-data,Ruby,Arrays,Count,Duplicate Data,如何计算ruby数组中的重复数 例如,如果我的数组有三个a,我如何计算这将产生重复元素作为散列,每个重复项的出现次数。让代码说话: #!/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

如何计算ruby数组中的重复数


例如,如果我的数组有三个a,我如何计算这将产生重复元素作为散列,每个重复项的出现次数。让代码说话:

#!/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}

我不认为有一个内置的方法。如果您所需要的只是副本的总数,那么可以取a.length-a.uniq.length。如果要查找单个特定元素的计数,请尝试
a.选择{e | e==my_element}.length

简单

arr = [2,3,4,3,2,67,2]
repeats = arr.length - arr.uniq.length
puts repeats

对于
group\u 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将返回一个Hash

ary.group_by{|elem| elem}.select{|key,val| val.length > 1}.keys
# => ["a", "b"]

哈希的另一个版本,数组中的每个元素都有一个键,每个元素的计数都有一个值

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 } 

要计算单个元素的实例,请使用inject

array.inject(0){|count,elem| elem == value ? count+1 : count}
鉴于:

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

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

# => [[1, 1], [2, 2], [3, 2], [4, 1], [5, 1]]
如果需要哈希而不是数组:

Hash[*counts.flatten]

# => {1=>1, 2=>2, 3=>2, 4=>1, 5=>1}
格雷普怎么样

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

arr.grep('Thanks').size # => 3
很简单:

words = ["aa","bb","cc","bb","bb","cc"]
一个简单的解决方案是:

words.each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }
它对我有用


谢谢

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

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

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


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

改进@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}

我过去曾为此使用过
reduce
/
inject
,如下所示

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

=> {1=>2, 5=>2, 4=>1, 3=>1, 6=>1, 8=>3, 9=>1}

获取数组中重复元素的Ruby代码:

numbers = [1,2,3,1,2,0,8,9,0,1,2,3]
similar =  numbers.each_with_object([]) do |n, dups|
    dups << n if seen.include?(n)
    seen << n 
end
print "similar --> ", similar
number=[1,2,3,1,2,0,8,9,0,1,2,3]
相似=数字。每个带有_对象([])的| n,重复|

dups另一种方法是使用
每个\u和\u对象

a=[1,2,3,3,4,3]
hash=a.each_与_对象({}){v,h|
h[v]| |=0
h[v]+=1
}
#散列={3=>3,2=>1,1=>1,4=>1}

这样,调用不存在的键(如
hash[5]
将返回
nil
,而不是
0

Ruby>=2.7解决方案如下:

增加了一种新方法

统计集合,即统计每个元素的出现次数。返回一个散列,其中集合的元素作为键,相应的计数作为值

现在,您将能够执行以下操作:

["a", "b", "c", "b"].tally  #=> {"a"=>1, "b"=>2, "c"=>1}

不再是-1,但认真地说。。。除非没有其他方法,否则不要使用monkey patch。最后的
有什么意义呢?注入({}{r,e{r[e.first]=e.last;r}
select
将返回一个散列,因此最终注入所做的只是什么都不做。如果您需要保留只出现一次的项,您可以将
v>1
更改为
v>0
,作为一行:
[1,2,3,3,4,3]。reduce(hash.new(0)){h,v|h.store(v,h[v]+1);h}
#reduce
通常比用于填充一个新变量的
#每个
更受欢迎。这是坚持Ruby方法的最干净的解决方案。我只想指出,这也适用于混合数组,在Ruby中,任何对象都可以是键!试着数数:[:a,:b,:a,1,10,10,“b”,“Bob”,“Bob”,“Bobby”]。事实上,它确实有效。
numbers = [1,2,3,1,2,0,8,9,0,1,2,3]
similar =  numbers.each_with_object([]) do |n, dups|
    dups << n if seen.include?(n)
    seen << n 
end
print "similar --> ", similar
arr = [1, 2, "a", "a", 4, "a", 2, 1]

arr.group_by(&:itself).transform_values(&:size)
#=> {1=>2, 2=>2, "a"=>3, 4=>1}
["a", "b", "c", "b"].tally  #=> {"a"=>1, "b"=>2, "c"=>1}