2012-01-04 227 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