2012-01-04 231 views
0

匹配短語需要在比較某種方式匹配短語來哈希和搶ID:紅寶石 - 哈希

哈希:

h = [{'id' => '1', 'words' => 'blue table stand'}, {'id' => '2', 'words' => 'red table stand'}] 

字:

search = 'stand blue' 

我想返回那些有'stand'和'blue'字樣的人的ID,以便我找回ID號碼1.謝謝。

+2

首先,你的'h'有一個錯誤的方法的氣味。你應該像'{1 =>%w [藍色桌臺],2 =>%w [紅色桌臺]}'。這更清晰,並會使其他方法更有效。 – sawa 2012-01-04 05:09:01

回答

2

我@sawa同意,該數據似乎並沒有在最舒適的方式形成,但你永遠不知道它是從哪裏來的?

無論如何,這應該工作:

search = "blue stand" 
h.select{|x| search.split.all?{|s| x["words"].split.include? s } }.map{|x| x["id"] } 

=> ["2"] 

從下面的評論中,使用的字符串[]訪問使這個短,我恨足以更新滾動條:

h.select{|x| search.split.all?{|s| x["words"][s] } }.map{|x| x["id"] } 
+1

一個很好的答案,但它使用正則表達式更清晰:[/ blue /,/ stand /]。all?{| r | r =〜x ['words']} – pguardiario 2012-01-04 06:10:33

+1

@pguardiario實際上,你不需要regexes(除非你想檢測字邊界):'%w [stand blue] .all?{| w | x [「words」] [w]}' – sawa 2012-01-04 06:57:17

+0

@sawa這是真的,你可以在[]中使用字符串或正則表達式,但我喜歡=〜更好。 – pguardiario 2012-01-04 07:07:05