Ruby动态生成指定结构二维数组的实现问题求助
嘿,我帮你梳理下这段代码的问题,然后给你个能正常运行的版本哈!
首先说原代码里的几个坑:
- 所有运动员共享同一个数组:你用
Array.new(field){athlete}创建二维数组时,每个元素都指向同一个athlete实例,这意味着你修改任何一个运动员的数据,所有运动员的数组都会跟着变,最后所有数据都会是最后一个运动员的内容,这肯定不是你想要的。 - 数组操作逻辑混乱:你在
athlete.each循环里反复用insert,但初始athlete是长度为5的数组,each会循环5次,每次插入5个元素,这会让数组越变越长,完全不符合“每个子数组5个元素”的需求。
下面是修正后的代码,完全符合你的需求:
print "Please enter the number of athletes competing in the triathalon: " field = gets.to_i triathalon = [] # 循环创建每位运动员的独立数据数组 field.times do |index| # 生成三项随机成绩 swim_time = rand(30..89) bike_time = rand(90..119) run_time = rand(120..360) # 计算总时长 total_time = swim_time + bike_time + run_time # 组装运动员数组:序号(从1开始)、三项成绩、总时长 athlete_data = [index + 1, swim_time, bike_time, run_time, total_time] triathalon << athlete_data end # 可选:打印结果验证 triathalon.each do |athlete| puts "Athlete #{athlete[0]} | Swim: #{athlete[1]}min | Bike: #{athlete[2]}min | Run: #{athlete[3]}min | Total: #{athlete[4]}min" end
我来解释下关键的修正点:
- 每个运动员用独立数组:每次循环都新建一个
athlete_data数组,这样每个子数组都是独立的,不会互相干扰。 - 逻辑更清晰:把三项成绩单独赋值,计算总和后再组装数组,比原代码的
insert操作直观多了,也不容易出错。 - 序号生成更安全:用
index + 1(因为times的索引从0开始)生成运动员序号,替代原代码的全局count变量,避免了变量污染的问题。 - 直接构造数组:用数组字面量直接创建5个元素的子数组,完全符合你“第一个元素预设值(序号),后续三个随机值,最后一个是总和”的要求。
你可以运行这段代码试试,输入运动员数量后,就能得到每个运动员独立的成绩数组啦!
内容的提问来源于stack exchange,提问作者Gryphon59
相关产品推荐
相关产品推荐

