😽
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