Just do IT

思うは招く

【Ruby】Array#combination と Array#repeated_combinationの違い

Array#combination

RubyArray#combinationは、配列内の要素の各組み合わせをすべて作る。

Array#combination (Ruby 3.1 リファレンスマニュアル)

まずはシンプルな例から。たとえば、バスケ選手が3人集まって1on1をしたいとする。3人の1on1の組み合わせを計算したいときはこんなふうに使える。

arr = %w[jason jaylen james]

arr.combination(2).to_a
=> [["jason", "jaylen"], ["jason", "james"], ["jaylen", "james"]]
  • 引数に2を渡しているので、2人組の組み合わせを返している
  • Array#combinationだけ書いた場合はEnumeratorオブジェクトを返す

なお、Array#combination["jason", "jayson"]といった重複は返さない。

では、引数に3を渡すとどうなるか?

> arr.combination(3).to_a
=> [["jason", "jaylen", "james"]]

3人の組み合わせは1通りしかないので、1つの配列になって返る。

arr.combination(2).to_aで重複を発生させたい場合はArray#repeated_combinationが使える。

Array#repeated_combination

Array#repeated_combination (Ruby 3.1 リファレンスマニュアル)

> arr = %w[jason jaylen james]

# 重複が発生している
> arr.repeated_permutation(2).to_a
=>
[["jason", "jason"],
 ["jason", "jaylen"],
 ["jason", "james"],
 ["jaylen", "jason"],
 ["jaylen", "jaylen"],
 ["jaylen", "james"],
 ["james", "jason"],
 ["james", "jaylen"],
 ["james", "james"]]

# combinationメソッドは重複させない
> arr.combination(2).to_a
=> [["jason", "jaylen"], ["jason", "james"], ["jaylen", "james"]]

参考 - Ruby Arrayの組み合わせ系メソッドまとめ - Qiita