3

我正在尝试从文件中获取大量数字,将它们存储为数组,然后将它们相加。

nums = Array.new
x, total=0, 0
file = File.open("inputfile.txt", 'r')
while !file.eof?
  nums[x] = file.readline
  x+=1
end

while x>0
  x-=1
  total += nums[x]
end

puts total

当我的代码执行时,我收到一条错误消息:

String can't be coerced into Fixnum (TypeError)

我检查以确保每个数组元素实际上都包含正确的数据。我认为这些数字在存储时被视为字符串。如果是这种情况,我将如何将数组更改为整数以便将它们加起来?

4

3 回答 3

4

只需修改

nums[x] = file.readline

nums[x] = file.readline.to_i

干杯!

于 2013-05-22T02:11:19.867 回答
1

这是我的做法:

total = 0
File.foreach("inputfile.txt") { |li| total += li.to_i }
puts total

在内存中存储一​​个大数组不是一个好主意,因为您可以在代码计算总和之前填充可用内存。相反,请逐行阅读文件并随时计算。

基准测试表明,逐行 I/O 与将整个文件读入内存然后尝试将其作为单行处理一样快,因此请使用更保守的方法IO.foreachios.each_line避免不必要地填充内存。

于 2013-05-22T04:25:13.060 回答
1

您可以逐行遍历打开的文件:

total = File.open("inputfile.txt").inject(0) { |sum, line| sum + line.to_i }

另请参阅 squiguy 评论中的示例,使用mapand reduce

于 2013-05-22T02:36:21.280 回答