Ruby合作伙伴配对程序不起作用?

时间:2017-07-21 20:16:04

标签: arrays ruby

我是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

1 个答案:

答案 0 :(得分:1)

您的问题是:splitNames.sample << splitNames[arrayPos].pop

sample可以返回数组的任何元素,包括具有您尝试分配的奇怪人物的元素!因此,如果它对该人进行采样,则会将其从1组中删除,然后将其添加回来。

要修复它,请利用以下事实:所有组都将成对,或者最后一组将只有一个人。不要遍历数组,只需检查splitNames[-1]。如果他们一个人,请将其添加到splitNames[0...-1].sample