我有一个类似的文件:
Fruit.Store={
#blabla
"customer-id:12345,item:store/apple" = 10; #blabla
"customer-id:23456,item:store/banana" = 10; #blabla
"customer-id:23456,item:store/watermelon" = 10;
#blabla
"customer-id:67890,item:store/watermelon" = 10;
}
除了评论之外,每一行都具有相同的格式:customer-id和item:store /是固定的,customer-id是一个5位数字。文件中大约有1000个唯一行。输入“12345”和“apple”时,应返回第一行。 Ruby解决这个问题的最有效方法是什么?谢谢!
答案 0 :(得分:1)
def lookup(input, id, fruit)
IO.foreach(input).detect do |line|
line =~ %r|^\p{Space}*customer-id:#{id},item:store/#{fruit}|
end
end
lookup("/path/to/file", 12345, 'apple')
#⇒ " \"customer-id:12345,item:store/apple\" = 10; #blabla\n"
答案 1 :(得分:1)
Ruby解决这个问题的最有效方法是什么?
(假设您可以立即将整个数据集加载到内存中并保留在那里。)
在加载时,将文件转换为此形状的哈希值。
data = {
[12345, 'apple'] => 10,
[23456, 'banana'] => 10,
...
}
然后你就这样做了:
data[[12345, 'apple']] # => 10 or nil (if not found)
这为您提供了O(1)查找。你不可能比这更有效率。
如果你想直接处理文件,那么你可以逐行阅读文件并尝试检测匹配行,如@ mudasobwa的回答所示。在这种情况下查找的效率要低得多,但另一方面,它不需要预处理。因此,如果您只想进行一次查找,那么整体效率可能更高。