2015-08-24 150 views
1

我的目標是把姓名和號碼的哈希值,例如:集團通過散列紅寶石

由他們是否達到「合格」成績
hash = { 
    "Matt" => 30, 
    "Dave" => 50, 
    "Alex" => 60 
} 

和將它們分組。我想結果,以作爲數組傳遞到兩個獨立的按鍵,說:pass:fail這樣的:

hash = { "pass" => ["Alex", 60], "fail" => [["Matt", 30]["Dave",60]]} 

我知道group_by方法是我需要的,但我不知道,我怎麼會將值傳遞給新密鑰。

通過等級由用戶決定。在這個例子中,你可以使用45

+0

1.什麼是讓Dave得分爲60的邏輯? – sawa

+0

2.什麼是「及格分數」? – sawa

+0

3.什麼是讓''Alex''(用60)通過而'Dave''(60用某種方式)失敗的邏輯? – sawa

回答

5

你可以做這樣的財產以後以這樣的方式:

PASSING_GRADE = 45 
hash.group_by {|_, v| v >= PASSING_GRADE ? 'pass' : 'fail'} 

下面是結果:

{"fail"=>[["Matt", 30], "pass"=>[["Alex", 60], ["Dave", 50]]]} 
+0

這非常有幫助。我很躊躇,因爲我不熟悉語法 –

+0

中的「:pass::fail」部分喲可以使用「if」,如果你願意的話,但我認爲最好在這裏使用三元運算符 –

1

你可以簡單地做這樣的事情:

sorted = {"pass" => [], "fail" => []} 
hash.each do |name, grade| 
    if grade >= PASSING_GRADE 
    sorted["pass"] << [name, grade] 
    else 
    sorted["fail"] << [name, grade] 
    end 
end 
0

這裏有兩種方法:

#1

a = hash.to_a 
{ "pass" => a.select { |_,v| v > 50 }, "fail" => a.reject { |_,v| v > 50 } } 
    #=> {"pass"=>[["Alex", 60]], "fail"=>[["Matt", 30], ["Dave", 50]]} 

#2

[:pass, :fail].zip(hash.to_a.partition { |_,v| v > 50 }).to_h 
    #=> {:pass=>[["Alex", 60]], :fail=>[["Matt", 30], ["Dave", 50]]} 

這些均可以得到的返回值元組的數組,你想爲"fail"而不是"pass"。難道這不會讓人感到痛苦嗎?兩個都是元組數組不是更好嗎?

考慮返回哈希爲值:

{"pass" => hash.select { |_,v| v > 50 }, "fail" => hash.reject {|_,v| v > 50 }} 
    #=> {"pass"=>{"Alex"=>60}, "fail"=>{"Matt"=>30, "Dave"=>50}} 

這豈不是更方便?