从文件中读取整数数组

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)

我检查了每个数组元素确保它们实际上具有正确的数据。我认为当存储时,这些数字被视为字符串。如果是这种情况,我该如何将数组更改为整数,以便可以对它们进行总计?


3
如果文件中只包含数字,我可以这样打高尔夫球:puts IO.readlines("inputfile.txt").map(&:to_i).reduce(:+) - squiguy
3个回答

4

只需修改


nums[x] = file.readline

为了

nums[x] = file.readline.to_i

干杯!


1
您可以逐行迭代打开的文件:
total = File.open("inputfile.txt").inject(0) { |sum, line| sum + line.to_i }

还可以参考squiguy在评论中使用mapreduce的示例。


有趣...我本来以为应该是 File.open("inputfile.txt").read_lines.inject(0),但我猜 read_lines 是隐式的? - Alexander Wallace Matchneer
@AlexanderWallaceMatchneer 好问题,但我不会这样描述它。read_lines 读取整个文件并为您提供数据结构,即每行的数组。相比之下,open 提供给你一个File实例,可以迭代地按行处理。这就是为什么它可以直接管道传输到 inject,而不需要创建一个庞大的数据结构(所有行的数组)。 - FMc

1

这是我的做法:

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

将大型数组存储在内存中并不是一个好主意,因为您的代码在计算总和之前可能会填满可用内存。相反,逐行读取文件并随时计算。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接