2012-02-22 82 views
1

Ruby的新品牌。我試圖使用發送的電子郵件數量對發件人(發件人)的重複列表進行排序。此代碼正在工作,但它按字母順序排序。我無法弄清楚如何對它進行排序,從而使電子郵件的最#是在上面,等排序哈希值一個值不是其他

results = [] 
mail_count = imap.search(["SINCE", @this_week.strftime("%d-%b-%Y")]).each do |message_id| 
    envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"] 
    @from_array = envelope.from[0].name.to_a 
    results << @from_array 
end 

# make the hash default to 0 so that += will work correctly 
from_count = Hash.new(0) 

# iterate over the array, counting duplicate entries 
results.each do |v| 
    from_count[v] += 1 
end 

from_count.sort_by do |k, v| v 
     puts "#{v} -- #{k}" 
end 

回答

1
from_count.sort_by{|k,v| v } 

應該做的伎倆。

然後,您可以迭代排序後的散列並打印結果。

所以,你的代碼應該是這樣的:

from_count.sort_by{|k,v| v }.first(10).each{|k,v| puts "#{v} -- #{k}" } 

sort_by排序,然後在排序完成後,我們打印結果。

+0

當我這樣做,並試圖添加「puts」#{v} - #{k}「我得到一個錯誤未定義的局部變量或方法'v' – krapdagn 2012-02-22 06:35:13

+0

不要添加puts語句。puts'返回'nil'並擰緊排序 – 2012-02-22 06:36:52

+0

我想我已經完全掌握了 - 不知道如何打印排序後的Hash格式,它表示10 - FROMa,9 - FROMb等格式它用於打印它很好,只是按字母順序排序,而不是數字排序。 – krapdagn 2012-02-22 06:38:09