簡體   English   中英

如何對一個值的重復求和並將其添加到 Ruby 中一個鍵的兩個值中?

[英]How to sum repetitions of a value and add it in two values of a key in Ruby?

我試圖創建一個 hash,每個目錄上每種類型的擴展都有一個鍵。 對於每個鍵,我想添加兩個值:重復該擴展名的次數和具有該擴展名的所有文件的總大小。

與此類似的東西:

{".md" => {"ext_reps" => 6, "ext_size_sum" => 2350}, ".txt" => {"ext_reps" => 3, "ext_size_sum" => 1300}}

但我被困在這一步:

hash = Hash.new{|hsh,key| hsh[key] = {}}
ext_reps = 0
ext_size_sum = 0

Dir.glob("/home/computer/Desktop/**/*.*").each do |file|
  hash[File.extname(file)].store "ext_reps", ext_reps
  hash[File.extname(file)].store "ext_size_sum", ext_size_sum 
end

p hash

有了這個結果:

{".md" => {"ext_reps" => 0, "ext_size_sum" => 0}, ".txt" => {"ext_reps" => 0, "ext_size_sum" => 0}}

而且我找不到增加ext_repsext_siz_sum的方法

謝謝

假設繪制的文件大小如下。

files = [{ ext: 'a', size: 10 },
         { ext: 'b', size: 20 },
         { ext: 'a', size: 30 },
         { ext: 'c', size: 40 },
         { ext: 'b', size: 50 },
         { ext: 'a', size: 60 }]

您可以使用Hash#group_byHash#transform_values

files.group_by { |h| h[:ext] }.
      transform_values do |arr|
        { "ext_reps"=>arr.size, "ext_size_sum"=>arr.sum { |h| h[:size] } }
      end
        #=> {"a"=>{"ext_reps"=>3, "ext_size_sum"=>100},
        #    "b"=>{"ext_reps"=>2, "ext_size_sum"=>70},
        #    "c"=>{"ext_reps"=>1, "ext_size_sum"=>40}}

請注意,第一個計算如下。

files.group_by { |h| h[:ext] }
  #=> {"a"=>[{:ext=>"a", :size=>10}, {:ext=>"a", :size=>30},
  #          {:ext=>"a", :size=>60}],
  #    "b"=>[{:ext=>"b", :size=>20}, {:ext=>"b", :size=>50}],
  #    "c"=>[{:ext=>"c", :size=>40}]}

這不是最“類似 Ruby”的解決方案,但與您提供的示例一起,這可能是您最終最終得到的解決方案。 您的主要問題是您從未增加ext_reps值,也從未累積ext_size_sum值。

hash = {}
Dir.glob('/home/computer/Desktop/**/*.*').each do |file|
  file_extension = File.extname(file)

  if hash[file_extension].nil?
    # This is the first time this file extension has been seen, so initialize things for it.

    hash[file_extension]                 = {}
    hash[file_extension]['ext_reps']     = 0
    hash[file_extension]['ext_size_sum'] = 0
  end

  # Increment/accumulate values.
  hash[file_extension]['ext_reps']     += 1
  hash[file_extension]['ext_size_sum'] += file.size
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM