我怎样才能在Ruby中改组数组/哈希?

时间:2011-02-20 22:52:18

标签: ruby shuffle

出于学习目的,这叫什么?是创建对象是数组还是哈希?

stack_of_cards = []

这就是我填写它的方式:

stack_of_cards << Card.new("A", "Spades", 1)
stack_of_cards << Card.new("2", "Spades", 2)
stack_of_cards << Card.new("3", "Spades", 3)
...

这是我的卡类:

class Card

  attr_accessor :number, :suit, :value

  def initialize(number, suit, value)
    @number = number
    @suit = suit
    @value = value
  end

  def to_s
    "#{@number} of #{@suit}"
  end
end

我想将这个数组/哈希中的元素混洗(这叫做什么?:S)

有什么建议吗?

8 个答案:

答案 0 :(得分:18)

stack_of_cards.shuffle

这是一个数组,有关详细信息,请参阅http://www.ruby-doc.org/core-1.8.7/classes/Array.html

我已经编写了functional表单,它返回一个新的数组,而且它是一个新的数组。您可以改为使用:

stack_of_cards.shuffle!

......将阵列原位洗牌。

答案 1 :(得分:10)

如果你想要改组哈希,你可以使用这样的东西:

class Hash
  def shuffle
    Hash[self.to_a.sample(self.length)]
  end

  def shuffle!
    self.replace(self.shuffle)
  end
end

我发布了这个答案,因为如果我搜索“ruby shuffle hash”,我总会发现这个问题。

答案 2 :(得分:1)

using the shuffle method外,您还可以使用排序方法:

array.sort {|a, b| rand <=> rand }

如果您使用未实现shuffle的旧版Ruby,这可能会有用。与shuffle!一样,您可以使用sort!处理现有数组。

答案 3 :(得分:1)

如果你想疯狂并编写自己的就地随机播放方法,你可以做这样的事情。

 def shuffle_me(array)
   (array.size-1).downto(1) do |i|
     j = rand(i+1)
     array[i], array[j] = array[j], array[i]
   end

   array
 end 

答案 4 :(得分:1)

对于数组:

array.shuffle
[1, 3, 2].shuffle
#=> [3, 1, 2]

哈希:

Hash[*hash.to_a.shuffle.flatten]
Hash[*{a: 1, b: 2, c: 3}.to_a.shuffle.flatten(1)]
#=> {:b=>2, :c=>3, :a=>1}
#=> {:c=>3, :a=>1, :b=>2}
#=> {:a=>1, :b=>2, :c=>3}
# Also works for hashes containing arrays
Hash[*{a: [1, 2], b: [2, 3], c: [3, 4]}.to_a.shuffle.flatten(1)]
#=> {:b=>2, :c=>3, :a=>1}
#=> {:c=>[3, 4], :a=>[1, 2], :b=>[2, 3]}

答案 5 :(得分:1)

旧问题,但也许对其他人有所帮助。我用它来创建纸牌游戏,这就是@ davissp14编写的,它被称为“ Fisher-Yates算法”

if (window.ethereum) {
    const web3 = new Web3(ethereum);
    try {
        await ethereum.enable();
        var accounts = await web3.eth.getAccounts();
        console.log(accounts)

    } catch (error) {
        // User denied account access...
    }
}

现在您可以将其用作:

module FisherYates

  def self.shuffle(numbers)
    n = numbers.length
    while n > 0 
      x = rand(n-=1)
      numbers[x], numbers[n] = numbers[n], numbers[x]
    end
    return numbers
  end

end 

https://dev.to/linuxander/fisher-yates-shuffle-with-ruby-1p7h

答案 6 :(得分:0)

如果您想重新整理哈希,但又不想重载Hash类,则可以使用sort函数,然后使用to_h函数将其转换回哈希(Ruby 2.1 +):

which python

答案 7 :(得分:0)

对于数组:

array.shuffle

对于散列:

hash.sort_by{ rand() }