2012-10-19 194 views
2

我想按Hash1的值的順序對Hash2的鍵進行排序。 Hash2不需要包含Hash1的所有值。 Hash1不需要包含Hash2的所有鍵。 如果Hash2中存在一個在Hash1中沒有相應值的密鑰,它應該在任何現有的有序密鑰下面排序。按另一個散列中的值對散​​列進行排序

Hash1 = { 
    p0: "q11", 
    p1: "q55", 
    p2: "q92", 
    p3: "q77" 

} 

Hash2 = { 
    q55: {...}, 
    q23: {...}, 
    q59: {...}, 
    q98: {...}, 
    q11: {...} 
} 

=> 
DesiredHash = { 
    q11: {...}, 
    q55: {...}, 
    q23: {...}, 
    q59: {...},  
    q98: {...} 
} 

什麼是實現這一目標的最紅寶石方式?

回答

2
array = Hash1.map{|k, v| [k, v.to_sym]} 
Hash[Hash2.sort_by{|k, _| array.index{|_, v| k == v} || array.length}] 

或者,也許效率較低,但更短:

array = Hash1.to_a 
Hash[Hash2.sort_by{|k, _| array.index{|_, v| k == v.to_s} || array.length}] 

解釋(使用第二個) Hash1將被用來作爲參考,這意味着你想要做的東西了「指數」。由於哈希不具有索引的概念,因此必須將其轉換爲arrayto_a這樣做。接下來,您想排列Hash2(這意味着它將按照索引array的順序隱式轉換爲具有鍵值對的數組),使得Hash2的鍵與array的「值」匹配。 index{...}會查找這樣的索引。如果不匹配,將分配array.length,該值大於任何索引array。最後,您想要將這些鍵值對變回散列。這由Hash[...]完成。

+0

你能解釋一下這到底是怎麼回事呢?它非常有效,但我想了解我是否能夠。 –

+0

我加了解釋。 – sawa

1
hash1 = { 
    p0: "q11", 
    p1: "q55", 
    p2: "q92", 
    p3: "q77" 

} 

hash2 = { 
    q55: 1, 
    q23: 2, 
    q59: 3, 
    q98: 4, 
    q11: 5 
} 

def get_key(hash, value) 
    hash.each { |k, v| return k if v == value } 
    return hash.keys.max 
end 

Hash[hash2.sort_by { |a, _| get_key(hash1, a.to_s) }] 
#=> {:q11=>5, :q55=>1, :q23=>2, :q98=>4, :q59=>3} 
+0

有沒有一種快速簡單的方法將數組的最終數組變成哈希? –

+0

啊哈希[],我看到 –

+0

@OnNoezWoez對不起,我編輯了答案。 – oldergod

3

到@澤的,但使用散列值#真的清理東西恕我直言,類似:

keys = Hash1.values.map &:to_sym 
Hash[Hash2.sort_by{|k, v| keys.index(k) || keys.length}] 
相關問題