2009-11-19 48 views
0

我正在http://rubyquiz.com/quiz28.html上工作,除了一個小小的錯誤之外,我幾乎完成了。散列重複

在下面的:提示是一個數組,其中爲了討論是["one", "two", "three", "three", "four]

def ask_reader(prompts) 
    @answers = {} 
    for p in prompts 
     puts "Give me a #{p}" 
     @answers[p] = gets.chomp 
    end 
    end 

這工作正常和我得到一個答案散列與相應的答案,除了第二答案[P]將覆蓋第一個,因此只留下一個「三」的價值。解決這個問題有沒有很好的「紅寶石」方法?謝謝。

+0

您如何期望算法爲相同的對象生成唯一的哈希碼?如果您需要此功能,您正在使用錯誤的數據結構 –

回答

2

兩個顯而易見的選擇:

交叉引用原始提示陣列與答案陣列通過裝置Array#zip

def ask_reader(prompts) 
    prompts.inject([]) do |accu, p| 
    puts "Give me a #{p}" 
    accu << gets.chomp 
    accu 
    end 
end 

["one", "two", "two"].zip(["1", "2", "3"]) 
# => [["one", "1"], ["two", "2"], ["two", "3"]] 

然後遍歷像這樣:

[["one", "1"], ["two", "2"], ["two", "3"]].each do |(prompt, response)| 
    puts "#{prompt}: #{response}" 
end 

或者,使用HashArray值。

def ask_reader(prompts) 
    prompts.inject({}) do |accu, p| 
    puts "Give me a #{p}" 
    (accu[p] ||= []) << gets.chomp 
    accu 
    end 
end 
+0

謝謝,我使用了第一種解決方案(因爲這是最容易理解的)。 – asdfasdfasdfasdf

0

將內部字段'提示'用作鍵的某種包裝對象怎麼樣?

4

如何關於地圖上提示到的值的列表,這樣的:

PROMPT1 => [ 「一個」] PROMPT2 => [ 「2」] prompt3 => [ 「3」,「三「] prompt4 => [」 四「]

0

更簡單的方法。

a = %w[one two three four] 
h = Hash.new { |hash, key| hash[key] = a.find_index(key)+1} 
p h["one"] 
p h["three"]