如何计算Ruby 1.8.5(Sketchup Ruby API)中的重复哈希iten

如何计算Ruby 1.8.5(Sketchup Ruby API)中的重复哈希iten,ruby,hash,ruby-1.8,sketchup,Ruby,Hash,Ruby 1.8,Sketchup,我需要计算重复,他们需要100%相同,以增加我的计数,但我不能使用Ruby 1.8.5中的nothing,此代码将在google sketchup的插件中运行 GoogleSketchUpRubyAPI 简短答复: h = Hash.new 0 product_list.each {|p| h[p] += 1} product_list_result = h.keys.map{|k| k["count"] = h[k]; k} 详细解释这是如何工作的。 从您的数据开始: product_lis

我需要计算重复,他们需要100%相同,以增加我的计数,但我不能使用Ruby 1.8.5中的nothing,此代码将在google sketchup的插件中运行

GoogleSketchUpRubyAPI 简短答复:

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 = h.keys.map{|k| k["count"] = h[k]; k}
h、 keys从散列h返回一个键数组,散列h只是 你的名单。然后,函数映射用结果替换该数组中的每个对象 后面的块的一个实例,它只是将计数值添加到乘积散列中

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
用于不修改原始
产品列表


在ruby 1.8.7中测试

在ruby 1.8.5中测试错误:#抱歉,我无法检查RubyUse的较低版本,因为我的
backport
gem在ruby 1.8.5中使用
groupby
product_list_result = h.keys.map{|k| k["count"] = h[k]; k}
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}]