将数组的内容拆分为另外两个数组

时间:2014-10-30 01:13:09

标签: ruby arrays

简单的例子,但我想了解它是如何完成的,所以我可以应用它,否则我有一个包含6个元素的主数组。我想从主数组中取出3个元素并将其放入数组中,然后从主数组中取出其他3个元素并将它们放入b数组中。我会用这个来将它应用于两张牌手的发牌卡

main = [1, 2, 3, 4, 5, 6]
    a = [ ] 
    b = [ ]

4 个答案:

答案 0 :(得分:4)

main = [1, 2, 3, 4, 5, 6]
#=> [1, 2, 3, 4, 5, 6] 
main.first(3)
#=> [1, 2, 3] 
main.last(3)
#=> [4, 5, 6] 

答案 1 :(得分:1)

a = [1, 2, 3, 4, 5, 6]
#=> [1, 2, 3, 4, 5, 6]
b = a.take(3)
#=> [1, 2, 3]
c = a.drop(3)
#=> [4, 5, 6]

答案 2 :(得分:1)

所有人都可能给出了正确的答案,但正如我从你的问题中所理解的那样( I will use this to apply it to dealing cards to two players )当你发牌时,当你向牌main阵列发牌时应该从self数组中删除该元素以克服冗余问题(重复)。当您处理所有卡片main时,数组必须为空。

对于此解决方案,请查看 Array#shift

> main = [1,2,3,4,5,6]  # I have 6 cards on my hand before dealing cards to players
 => [1, 2, 3, 4, 5, 6] 
> a = main.shift(3)  # given 3 cards to Player a
 => [1, 2, 3] 
> b = main.shift(3)  # given 3 cards to Player b
 => [4, 5, 6] 
> main  # after dealing all cards to two players I should not have any card on my hand
 => [] 

答案 3 :(得分:0)

你有很多方法可以在Ruby中做同样的事情。拆分数组也不例外。许多答案(和评论)告诉你一些方法。如果你的程序正在交易卡,你不会就此止步。首先,你可能会有超过6张牌。其次,你可能会有超过2名球员。假设卡片是C而玩家是P.你需要编写一种方法,无论有多少Cs或Ps,该方法都会给每个玩家提供相同数量的Ccards(或者如果它返回错误)不能给它相同数量的卡)。因此,对于6张牌和2名玩家,它将分别提供3张牌。 12张牌和3名玩家,每张4张牌。对于3张牌和2张牌手,它会产生错误,因为牌不能均匀分割:

def split_cards_evenly_between_players(cards, players)
  if cards.size % players != 0
    raise 'Cannot split evenly!'
  else
    groups_to_split_into = cards.size / players
    cards.each_slice(groups_to_split_into).to_a
  end
end

我们来看看代码吧。如果牌不能在玩家之间平均分配,那么除以它们的余数将不是0(6张牌/ 3名牌手=余数为0. 7张牌/ 3名牌手=剩余1张)。这就是第2行检查的内容。如果卡片可以分割,那么我们首先找到要拆分的组(即将卡片数量除以玩家数量)。然后我们将数组拆分为多个具有Enumerable#each_slice的组。最后,由于这不会产生数组,我们需要.to_a来转换它。 Ruby中的返回值始终是最后执行的表达式的值。此方法中唯一的表达式是if / then表达式,它还返回最后执行的表达式的值(即each_slice所在的行)。我们试一试:

p split_cards_evenly_between_players([1,2,3,4,5,6,7,8,9,10,11,12],2) #=> [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
p split_cards_evenly_between_players([4,5,1,2,5,3], 3) #=> [[4, 5], [1, 2], [5, 3]]
p split_cards_evenly_between_players([1,2,3],2) #=> Error: Cannot split evenly!

Ruby的优点在于其简单的语法以及它在解决问题时试图摆脱困境的事实,因此您可以更多地关注实际问题而不是代码。