Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 文件中的整数数组_Ruby_String_Int - Fatal编程技术网

Ruby 文件中的整数数组

Ruby 文件中的整数数组,ruby,string,int,Ruby,String,Int,我试图从文件中获取大量数字,将它们存储为数组,然后将它们相加 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 b

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

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)
我检查以确保每个数组元素中都包含正确的数据。我认为这些数字在存储时被认为是字符串。如果是这种情况,我如何将数组更改为整数,以便将它们相加?

只需修改即可

nums[x] = file.readline


干杯

您可以在打开的文件上逐行迭代:

total = File.open("inputfile.txt").inject(0) { |sum, line| sum + line.to_i }
另请参见squiguy评论中的示例,使用
map
reduce

以下是我的做法:

total = 0
File.foreach("inputfile.txt") { |li| total += li.to_i }
puts total
在内存中存储一个大数组不是一个好主意,因为您可以在代码计算和之前填充可用内存。相反,逐行读取文件,并边走边计算


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

如果文件包含所有数字,我可以这样做:
put IO.readlines(“inputfile.txt”).map(&:to_i).reduce(:+)
。有趣的。。。我本以为是
File.open(“inputfile.txt”).read\u lines.inject(0)
,但我想
read\u lines
是隐含的?@AlexanderWallaceMatchneer问得好,但我不会这样描述
read_lines
读取整个文件并为您提供一个数据结构,即每行的数组。相比之下,
open
提供了一个文件实例,可以逐行访问。这就是为什么它可以直接通过管道传输到inject中,而无需创建庞大的数据结构(所有行的数组)。
total = 0
File.foreach("inputfile.txt") { |li| total += li.to_i }
puts total