sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    How to count duplicates hash itens in Ruby

    Scheduled Pinned Locked Moved Developers' Forum
    6 Posts 4 Posters 2.3k Views 4 Watching
    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.
    • romuloigorR Offline
      romuloigor
      last edited by romuloigor

      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
      • TIGT Offline
        TIG Moderator
        last edited by

        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
        • romuloigorR Offline
          romuloigor
          last edited by

          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
          • romuloigorR Offline
            romuloigor
            last edited by

            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

              
              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
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                # 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
                • First post
                  Last post
                Buy SketchPlus
                Buy SUbD
                Buy WrapR
                Buy eBook
                Buy Modelur
                Buy Vertex Tools
                Buy SketchCuisine
                Buy FormFonts

                Advertisement