【问题标题】:How to count duplicates hash itens in Ruby 1.8.5 ( Sketchup Ruby API )如何计算 Ruby 1.8.5 中的重复哈希值(Sketchup Ruby API)
【发布时间】:2012-09-02 14:17:01
【问题描述】:

我需要计算重复项,它们需要 100% 相同才能增加我的计数,但我不能使用 Ruby 1.8.5 之外的任何内容,此代码将在 google sketchup 的插件中运行

Google Sketchup Ruby API

puts VERSION
1.8.5

puts RUBY_PLATFORM
i686-darwin8.10.1

product = 'Glass'
x = width
y = length
z = density

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}
                      ];

【问题讨论】:

    标签: ruby hash ruby-1.8 sketchup


    【解决方案1】:

    简答:

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

    更长的答案解释了这是如何工作的。 从您的数据开始:

    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}
                   ];
    
    # First, create a hash to count the number of unique products. Have the initial
    # count be 0.
    h = Hash.new 0
    
    # Add each product to the hash count.
    product_list.each {|p| h[p] += 1}
    

    现在您有了一个以产品为键的散列,并计为值:

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

    现在将其转换为您想要的数组格式:

    product_list_result = []
    h.keys.each do |k|
        # since each key is a product hash, we can add count to it
        k["count"] = h[k]
    
        # Now, add that to the array
        product_list_result << k
    end
    

    结果:

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

    数组转换可以做得更简洁:

    product_list_result = h.keys.map{|k| k["count"] = h[k]; k}
    

    h.keys 从哈希 h 中返回一个键数组,这只是其中的唯一产品 你的清单。然后,函数映射用结果替换该数组中的每个对象 后面的块,它只是将计数值添加到产品哈希中。

    【讨论】:

      【解决方案2】:
      product_list.dup.group_by { |h| h }.each_value.map do |value| 
        value.first.tap { |hash| hash['count'] = value.count }
      end
      
      => [{"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}]
      

      dup是为了不修改原来的product_list

      ruby 1.8.7测试

      【讨论】:

      • 在 Ruby 1.8.5 中测试错误:#>
      • 对不起,我无法检查 Ruby 的低版本
      • 使用我的 backports gem 在 Ruby 1.8.5 中使用 group_by
      猜你喜欢
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 2011-06-01
      • 2014-04-09
      • 2011-05-08
      相关资源
      最近更新 更多