配列内で重複している要素を見つける

自分用メモ。

Rubyで配列から重複したモノ(要素)を抜き出す(Uniqの逆) - それマグで!
上のリンクは一番素直な方法だと思うけど二重ループ。
ソートして隣り合っている要素を比べるという方法を試してみた。

a=[8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 10, 10]
a_sorted = a.sort
p a_sorted.each_with_index.map{|e,i| e==a_sorted[i-1] ? e : nil }.reject{|e| !e}
#=>[2, 4, 6, 8, 8, 10, 10]

いくつ重複しているかもちゃんと分かる。
ソート後の配列の最初と最後を比較しちゃっているけど、まあいいか。


#ありえない凡ミスを2時間ほど晒していたのは秘密.

2012-06-30追記

id:takuya_1stさんからトラックバック返し(?)を頂きました。
あまり大きなデータを念頭に置いていなかったのですが、ソーティングのコストも合わせて考えないといけないですね。
データサイズやデータ配列のパターン(重複が多いのか少ないのかとか)といったことが影響しそう。

よりシンプルな書き方も教えていただいて感謝感謝。