首先,散列是這類數據的一個很好的起點。相反的:
LANGPROFICIENCY = [
["Elementary proficiency", 1],
["Limited working proficiency", 2],
["Professional working proficiency", 3],
["Full professional proficiency", 4],
["Native or bilingual proficiency", 5]
]
使用:
LANGPROFICIENCY = {
"Elementary proficiency" => 1,
"Limited working proficiency" => 2,
"Professional working proficiency" => 3,
"Full professional proficiency" => 4,
"Native or bilingual proficiency" => 5
}
可以單獨如果你想抓住keys
或values
,使得當你需要他們的個人方便,或者你可以查找的關鍵在於找到價值一如既往。
從那裏,你可以扭轉的哈希:
Hash[*LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten]
將返回:
{
1 => "Elementary proficiency",
2 => "Limited working proficiency",
3 => "Professional working proficiency",
4 => "Full professional proficiency",
5 => "Native or bilingual proficiency"
}
使得它很容易做到反向查找。
考慮所有一步,如果你知道不會有衝突,這不應該有:
LANGPROFICIENCY = LANGPROFICIENCY.merge(Hash[ *LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten ])
導致:
{
"Elementary proficiency" => 1,
"Limited working proficiency" => 2,
"Professional working proficiency" => 3,
"Full professional proficiency" => 4,
"Native or bilingual proficiency" => 5,
1 => "Elementary proficiency",
2 => "Limited working proficiency",
3 => "Professional working proficiency",
4 => "Full professional proficiency",
5 => "Native or bilingual proficiency"
}
你可以看一下無論是前進還是後退。它確實弄亂了你只抓住鍵或值的能力,但你可以在其中一箇中間步驟找到解決辦法。
我一直在使用這個技巧,或者在這個主題上有所變化。它使得使用一個變量來回映射變得非常容易。
現在,如果您一直在嘗試IRB或Ruby中的每一步,您將收到多個有關「warning: already initialized constant LANGPROFICIENCY
」的警告。答案是使用變量而不是常量。此外,LANGPROFICIENCY幾乎不是一個可讀的變量名稱。我建議使用lang_proficiency
或類似的東西。
我認爲這需要'LANGPROFICIENCY.flatten [2 *(value-1)]' – 2011-05-02 21:46:24
@Jeff - 是的,編輯:) – 2011-05-02 21:55:07
perfecto ....謝謝! – stewart715 2011-05-02 22:07:09