Ruby代码qn。 如何减少迭代
我是ruby的新手,我想知道为什么会出现这个错误。 (抱歉格式不正确)
错误:
rb37: in '%': nil can't be coerced into Fixnum (TypeError)
而且我的问题也需要帮助。 我想要提出一种方法来运行一个包含100万个ID号的列表,以便以最有效的方式(在不到5分钟内)找到一个特定的ID。 我整个下午一直在这里:(
def exist?(id) dump = [] employee_list = $employee_list.sort #employee_list is an array of 1 million lines of data, I have to look for a specific "id" while dump.length < id dump << employee_list.first if dump.last != id if id%dump.last != 0 && dump.last != 1 employee_list.delete_if { |n| n%dump.last == 0 } #what im doing here is to delete ID from employee_list that are multiples of n elsif id%dump.last == 0 employee_list.delete_if { |m| m%dump.last == 0 && m!=id } #deleting multiples of m (excluding id itself) end elsif dump.last == id return true end end return false end
老实说,我完全不知道你的代码试图做什么,但问题是:你循环直到dump
数组的长度大于你正在搜索的id
。 在循环中,将employee_list
数组的第一个元素追加到dump
的末尾。 您还可以从employee_list
删除内容。
现在,根据id
大小,你将经常循环。 例如,假设id
是1234567890
,你将循环超过十亿次,并且你将超过十亿个元素附加到你的dump
数组。 与此同时,您还会不断删除employee_list
。 很可能,在某个时间点, employee_list
将变为空,这意味着employee_list.first
将变为nil
,您将附加nil
作为dump
的最后一个元素,因此您将尝试获取id
的模数和在第nil
或13行中没有。
就像我说的,我实际上并不了解你在做什么,所以我不能告诉你如何解决这个问题。
这是我如何解决问题:
def exist?(id) $employee_list.find(id) end