2012-09-05 92 views
0

嗨,我很難做出這個散列,並通過創建和鍵,值對排序。我怎麼可以通過創建和鍵,值對排序這個散列

這裏是我的代碼

hash_answers = {} 
unless answers.blank? 
    answers.each_with_index do |ans ,index| 
    voted_up_users = ans.votes_up_by_all_users(ans) 
    voted_down_users = ans.votes_down_by_all_users(ans) 
    hash_answers[ans.id] = voted_up_users.count -voted_down_users.count #line one 
    hash_answers[index+1] = ans.created_at # line 2 
    end 
end 

如果我只有在代碼行1,那麼這不就行了2下面的代碼工作正常,我

 @answers = hash_answers.sort_by { |key, value| value }.reverse 

,但我也想通過craeted_at對它進行排序

我怎樣才能實現這一目標或進行哈希以另一種方式

任何幫助將是最欣賞

感謝

+0

你能否更詳細地描述你想要達到的目標? – muirbot

+0

我不明白你想做什麼,但是HashMap是無序的集合。你不能對它們進行排序。 – Cubic

+0

實際上,您可以對散列進行排序,但其中沒有太多價值。散列維護其插入順序,因此如果您通過鍵對現有散列進行排序並從結果列表構建新散列,則新散列將保持排序。它不會更有效率。 –

回答

0

通常你可以通過創建的這些東西一個數組排序上的一些事情和使用,作爲您的排序關鍵字:

@answers = hash_answers.sort_by { |k, v| [ v[:created_at], v[:count] } 

這是依賴於具有可排序的結構開始。你將兩個完全不同的東西干擾到同一個散列中。更好的方法可能是:

hash_answers[ans.id] = { 
    :id => ans.id, 
    :count => voted_up_users.count -voted_down_users.count, 
    :created_at => ans.created_at 
} 

可以調整數組中的元素的順序正確的順序進行排序。

+0

這給了我錯誤不能將符號轉換爲整數 – Kashiftufail

+0

這意味着你正在引用一個數組,就好像它是一個散列。確保'sort_by'迭代器中的'v'應該是一個哈希值。 – tadman

1
answers.sort_by do |ans| 
    [ans.net_votes, ans.created_at] 
end 

然後在你的答案類

def net_votes 
    votes_up_by_all_users - votes_down_by_all_users 
end 

你不應該有一個對象傳遞給自己作爲一個變量作爲ans.votes_up_by_all_users(ans)。對象總是知道自己。

相關問題