😽

Ruby で配列の隣り合う要素が同じものをユニークにする

2024/04/14に公開

例えば [1, 1, 2, 2, 1, 1] を単純に #uniq すると [1, 2] になるんですがこれを『隣り合う同士』でユニークにして [1, 2, 1] にしたい感じです。
こういう場合は Array#chunk_while が利用できます。
Array#chunk_while は先頭からイテレーションを行い『ブロックの結果が false になったところで区切る』ような配列の分割を行います。
今回の要求で言うと『途中で異なる値になったところで区切る』ようにすると期待するような結果を得ることができます。

array = [1, 1, 2, 2, 3, 2, 2, 3, 3, 1, 1, 1]
# elt_before, elt_after でイテレーションするときの前途の要素を受け取る
# 前後の要素が『同じ値』を区切るような処理を行う
result = array.chunk_while { |elt_before, elt_after| elt_before == elt_after }

pp result.to_a   # #chunk_while は Enumerator を返すので配列にして出力する
# => [[1, 1], [2, 2], [3], [2, 2], [3, 3], [1, 1, 1]]

# 今回の要求だと分割した配列の先頭を取得する事で実現できる
pp result.map(&:first)
# => [1, 2, 3, 2, 3, 1]

#chunk_whileArray ではなくて Enumerator を返すのでちょっと注意が必要です。
また『 true になったところで区切る』 Array#slice_when もあります。

参照

GitHubで編集を提案

Discussion