我是ruby的新手,并且拥有这个程序,它接受了许多名称并将它们分成两对,并将这个奇怪的人扔进一个随机组。有时候它会很完美,有时它会把额外的人扔进他们自己的阵列中,我不知道为什么。我知道有一种更简洁的方法可以做到这一点,但我只是想了解代码是如何工作的。例如,它应该返回" Apple" "香蕉" "橙色"作为[" Banana"," Orange"," Apple"]并且大部分时间都会这样,但有时它会给我[" Banana" ," Orange",] [" Apple"]有什么建议吗?
def randomArray
classNames = []
puts "Please enter a list of names to sort"
while true
input = gets.chomp
break if input.empty?
classNames << input
end
classRandom = classNames.shuffle
splitNames = classRandom.each_slice(2).to_a
arrayPos = 0
splitNames.length.times do
if splitNames[arrayPos].length == 2
arrayPos+=1
else splitNames[arrayPos].length == 1
splitNames.sample << splitNames[arrayPos].pop
arrayPos+=1
end
end
x = 0
splitNames.length.times do
break if splitNames[x].empty?
puts "Group number #{x+1} is #{splitNames[x]}"
x+=1
end
end
randomArray
答案 0 :(得分:1)
您的问题是:splitNames.sample << splitNames[arrayPos].pop
sample
可以返回数组的任何元素,包括具有您尝试分配的奇怪人物的元素!因此,如果它对该人进行采样,则会将其从1组中删除,然后将其添加回来。
要修复它,请利用以下事实:所有组都将成对,或者最后一组将只有一个人。不要遍历数组,只需检查splitNames[-1]
。如果他们一个人,请将其添加到splitNames[0...-1].sample
。