Shplele数组有例外

时间:2014-11-27 02:43:27

标签: ruby arrays

除了使用shuffle函数的指定索引外,有没有办法对数组中的所有元素进行混洗?

不必手动编写方法,Ruby是否支持类似的东西?

例如,假设我有一个整数数组:

array = [1,2,3,4,5]

我希望以任意随机顺序对元素进行洗牌,但将第一个int留在原位。最终结果可能是:

=> [1,4,3,2,5] 

只要第一个元素保留在原位。我显然已经通过创建自己的方法来找到解决方法,但是我想看看是否有某种内置函数可以帮助减少时间和空间。

2 个答案:

答案 0 :(得分:1)

简短的回答是否定的。根据最新的Ruby documentation of Array.shuffle,它接受​​的唯一参数是随机数生成器。所以你需要编写自己的方法 - 这是我对它的看法:

module ArrayExtender
  def shuffle_except(index)
    clone = self.clone
    clone.delete_at(index)
    clone.shuffle.insert(index, self[index])
  end
end

array = %w(a b c d e f)

array.extend(ArrayExtender)

print array.shuffle_except(1) # => ["e", "b", "f", "a", "d", "c"]
print array.shuffle_except(2) # => ["e", "a", "c", "b", "f", "d"]

答案 1 :(得分:1)

没有内置功能。它仍然很容易做到:

第一个元素

arr = [1, 2, 3, 4, 5]

hold = arr.shift
# => 1

arr.shuffle.unshift(hold)
# => [1, 4, 5, 2, 3]

特定索引

arr = [1, 2, 3, 4, 5]
index = 2

hold = arr.delete_at(index)
# => 3

arr.shuffle.insert(index, hold)
# => [5, 1, 3, 2, 4]