• Login
sketchucation logo sketchucation
  • Login
🤑 SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

How to count duplicates hash itens in Ruby

Scheduled Pinned Locked Moved Developers' Forum
6 Posts 4 Posters 2.3k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    romuloigor
    last edited by romuloigor 2 Sept 2012, 14:58

    I need to count the duplicates, they need to be 100% identical to increase my count, but I can not use a nothing out of Ruby 1.8.5, this code will run inside a plugin in google sketchup

    
    product_list = [ 
     { "product" => 1, "x" => 200, "y" => 100, "z" => 18},
     { "product" => 1, "x" => 200, "y" => 100, "z" => 18},
     { "product" => 1, "x" => 300, "y" => 100, "z" => 18},
     { "product" => 2, "x" => 300, "y" => 100, "z" => 18},
     { "product" => 2, "x" => 100, "y" => 100, "z" => 18},
     { "product" => 2, "x" => 100, "y" => 100, "z" => 18},
     { "product" => 3, "x" => 100, "y" => 100, "z" => 18} ];
    
    product_list_result = product_list.count_duplicate();
    
    product_list_result = [
     { "product" => 1, "x" => 200, "y" => 100, "z" => 18, "count" = 2},
     { "product" => 1, "x" => 300, "y" => 100, "z" => 18, "count" = 1},
     { "product" => 2, "x" => 300, "y" => 100, "z" => 18, "count" = 1},
     { "product" => 2, "x" => 100, "y" => 100, "z" => 18, "count" = 2},
     { "product" => 3, "x" => 100, "y" => 100, "z" => 18, "count" = 1}
                          ];
    
    1 Reply Last reply Reply Quote 0
    • T Offline
      TIG Moderator
      last edited by 2 Sept 2012, 17:40

      Sorry but your multiple very similar posts are getting confusing...
      You can edit a previous post !
      Why worry about a method that exists in a newer version, but is not available in this one...
      You need to make a method of your own that compares an array of hashes and then reports duplicates.
      I suggest .to_a and .sort will help to get indices and == will compare the hashes_as_array so you can count them...

      TIG

      1 Reply Last reply Reply Quote 0
      • R Offline
        romuloigor
        last edited by 2 Sept 2012, 20:53

        Run this code in Ruby 1.8.5 ( Ruby Console in Sketchup 8 )

         product_list.dup.group_by { |h| h }.each_value.map do |value| 
          value.first.tap { |hash| hash['count'] = value.count }
        end
        Error; #<NoMethodError; undefined method `group_by' for #<Array;0x12599cd4>>
        (eval);8
        

        Run this code in Ruby 1.8.7 ( irb in OSX Terminal )

        [{"count"=>2, "z"=>18, "y"=>100, "x"=>100, "product"=>2},
         {"count"=>1, "z"=>18, "y"=>100, "x"=>300, "product"=>1},
         {"count"=>2, "z"=>18, "y"=>100, "x"=>200, "product"=>1},
         {"count"=>1, "z"=>18, "y"=>100, "x"=>100, "product"=>3},
         {"count"=>1, "z"=>18, "y"=>100, "x"=>300, "product"=>2}]
        
        1 Reply Last reply Reply Quote 0
        • R Offline
          romuloigor
          last edited by 2 Sept 2012, 20:53

          Run this code in Ruby 1.8.5 ( Ruby Console in Sketchup 8 )

          h = Hash.new 0;
          product_list.each {|p| h[p] += 1};
          product_list_result = h.keys.map{|k| k["count"] = h[k]; k};
          

          Result:

          
          [{"x"=>300, "y"=>100, "z"=>18, "product"=>1, "count"=>1},
           {"x"=>200, "y"=>100, "z"=>18, "product"=>1, "count"=>1},
           {"x"=>100, "y"=>100, "z"=>18, "product"=>2, "count"=>1},
           {"x"=>300, "y"=>100, "z"=>18, "product"=>2, "count"=>1},
           {"x"=>200, "y"=>100, "z"=>18, "product"=>1, "count"=>1},
           {"x"=>100, "y"=>100, "z"=>18, "product"=>3, "count"=>1},
           {"x"=>100, "y"=>100, "z"=>18, "product"=>2, "count"=>1}]
          
          

          Run this code in Ruby 1.8.7 ( irb in OSX Terminal )
          Result:

          
          [{"product"=>1, "z"=>18, "y"=>100, "x"=>200, "count"=>2},
           {"product"=>3, "z"=>18, "y"=>100, "x"=>100, "count"=>1},
           {"product"=>2, "z"=>18, "y"=>100, "x"=>100, "count"=>2},
           {"product"=>1, "z"=>18, "y"=>100, "x"=>300, "count"=>1},
           {"product"=>2, "z"=>18, "y"=>100, "x"=>300, "count"=>1}]
          
          
          1 Reply Last reply Reply Quote 0
          • J Offline
            Jim
            last edited by 3 Sept 2012, 02:45

            
            result = product_list.inject(Hash.new(0)) {|h, e| h[e] += 1; h}
            result.each {|k, v| puts "#{k} --> #{v}"
            {"product"=>1, "x"=>200, "y"=>100, "z"=>18} --> 2
            {"product"=>1, "x"=>300, "y"=>100, "z"=>18} --> 1
            {"product"=>2, "x"=>300, "y"=>100, "z"=>18} --> 1
            {"product"=>2, "x"=>100, "y"=>100, "z"=>18} --> 2
            {"product"=>3, "x"=>100, "y"=>100, "z"=>18} --> 1
            
            

            Hi

            1 Reply Last reply Reply Quote 0
            • D Offline
              Dan Rathbun
              last edited by 3 Sept 2012, 03:42

              # EXAMPLE - untested
              
              module Romuloigor
              
                module Product
                
                  @@product = { ;count => {}, ;list => [
                      { "product" => 1, "x" => 200, "y" => 100, "z" => 18},
                      { "product" => 1, "x" => 200, "y" => 100, "z" => 18},
                      { "product" => 1, "x" => 300, "y" => 100, "z" => 18},
                      { "product" => 2, "x" => 300, "y" => 100, "z" => 18},
                      { "product" => 2, "x" => 100, "y" => 100, "z" => 18},
                      { "product" => 2, "x" => 100, "y" => 100, "z" => 18},
                      { "product" => 3, "x" => 100, "y" => 100, "z" => 18}
                    ]
                  }
                  
                
                  class << self
                  
                    def add(product)
                      #
                      @@product[;list] << product
                      #
                    end # add()
              
                    def recount()
                      #
                      @@product[;count]= @@product[;list].inject(Hash.new(0)) {|h, e| h[e] += 1; h}
                      #
                    end # recount()
              
                    def count(product)
                      #
                      total = @@product[;count][product]
                      return ( total ? total ; 0 )
                      #
                    end # count()
              
                    def list()
                      #
                      list = ""
                      @@product_list[;count].each {|k,v| list << "#{k.inspect} count = #{v}\n" }
                      return list
                      #
                    end # list()
              
                  end # proxy class
                
                end # module Product
                
              end # module Romuloigor
              
              

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • 1 / 1
              1 / 1
              • First post
                3/6
                Last post
              Buy SketchPlus
              Buy SUbD
              Buy WrapR
              Buy eBook
              Buy Modelur
              Buy Vertex Tools
              Buy SketchCuisine
              Buy FormFonts

              Advertisement