有什么快速的方法来获得给定散列的(随机)排列?例如用阵列我可以使用sample方法如Ruby哈希排列
ruby-1.9.2-p180 :031 > a = (1..5).to_a
=> [1, 2, 3, 4, 5]
ruby-1.9.2-p180 :032 > a.sample(a.length)
=> [3, 5, 1, 2, 4]
用于散列我可以使用散列密钥的相同的方法,并建立一个新的散列与
ruby-1.9.2-p180 :036 > h = { 1 => 'a', 2 => 'b', 3 => 'c' }
=> {1=>"a", 2=>"b", 3=>"c"}
ruby-1.9.2-p180 :037 > h.keys.sample(h.length).inject({}) { |h2, k| h2[k] = h[k]; h2 }
=> {3=>"c", 2=>"b", 1=>"a"}
但这是如此难看。有没有可以避免所有代码的散列的“样本”方法?
更新正如@Michael Kohl在评论中指出的,这个问题仅对ruby 1.9.x有意义。由于在1.8.x中哈希是无序的,所以没有办法做到这一点。
这是什么意思?在1.8哈希是无序的,并在1.9按插入顺序排序。 –
@Michael:看起来他正在使用1.9,因此'h.each'具有明确定义的顺序,所以对Hash进行洗牌是有道理的。 –
@MichaelKohl这只是一个好奇心。此外,即使使用1.8无序哈希来调用该方法,每次都会返回不同的顺序,而不是确定性和固定顺序。把它看作是散列类的洗牌。 – Fabio