😽
Ruby で配列の隣り合う要素が同じものをユニークにする
例えば [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_while は Array ではなくて Enumerator を返すのでちょっと注意が必要です。
また『 true になったところで区切る』 Array#slice_when もあります。
Discussion