How to count duplicates in Ruby Arrays

后端 未结 16 1617
清歌不尽
清歌不尽 2020-12-01 06:21

How do you count duplicates in a ruby array?

For example, if my array had three a\'s, how could I count that

相关标签:
16条回答
  • 2020-12-01 06:49

    Another way to count array duplicates is:

    arr= [2,2,3,3,2,4,2]
    
    arr.group_by{|x| x}.map{|k,v| [k,v.count] }
    

    result is

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

    0 讨论(0)
  • 2020-12-01 06:50

    Simple.

    arr = [2,3,4,3,2,67,2]
    repeats = arr.length - arr.uniq.length
    puts repeats
    
    0 讨论(0)
  • 2020-12-01 06:52

    Given:

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

    My favourite way of counting elements is:

    counts = arr.group_by{|i| i}.map{|k,v| [k, v.count] }
    
    # => [[1, 1], [2, 2], [3, 2], [4, 1], [5, 1]]
    

    If you need a hash instead of an array:

    Hash[*counts.flatten]
    
    # => {1=>1, 2=>2, 3=>2, 4=>1, 5=>1}
    
    0 讨论(0)
  • 2020-12-01 06:52
    arr = %w( a b c d c b a )
    # => ["a", "b", "c", "d", "c", "b", "a"]
    
    arr.count('a')
    # => 2
    
    0 讨论(0)
  • 2020-12-01 06:57

    This will yield the duplicate elements as a hash with the number of occurences for each duplicate item. Let the code speak:

    #!/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}
    
    0 讨论(0)
  • 2020-12-01 07:01

    Ruby code to get the repeated elements in the array:

    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
    
    0 讨论(0)
提交回复
热议问题