sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🛣️ Road Profile Builder | Generate roads, curbs and pavements easily Download

    How to count duplicates hash itens in Ruby

    Scheduled Pinned Locked Moved Developers' Forum
    6 Posts 4 Posters 2.4k 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 Online
        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