Rustでベクタ型の配列の重複を排除する方法

競技プログラミングをしていて配列の重複を排除する方法が分からなかったのでまとめます。

重複を排除する方法

重複を排除するには外部クレートを使うと簡単に記述できます。

# Cargo.toml
[dependencies]
itertools = "0.12"
use itertools::Itertools;

fn main() {
    let v = vec![1, 3, 2, 3, 5, 4];
    let unique_v: Vec<_> = v.into_iter().unique().collect();

    println!("Unique values: {:?}", unique_v); // Unique values: [1, 3, 2, 5, 4]
}

解説

.into_iter()

.unique()Iteratorトレイトに定義されている拡張メソッドでVecには定義されていないため.into_iter()が必要になります。

.iter()でも可能ですが戻り値の型が違います。

let v = vec![1, 2, 2, 3];

// 借用バージョン:型は &i32
let unique_refs: Vec<_> = v.iter().unique().collect();

// 所有権バージョン:型は i32
let unique_vals: Vec<_> = v.into_iter().unique().collect();

.unique()

イテレータから重複を排除します。

.collect()

  • Iterator の要素を「コレクション」に変換するメソッドです。
  • イテレータで順番に要素を取り出して、それらを指定したコレクション型(例: VecHashSetString など)にまとめます。

さいごに

今回は重複を排除する方法について書いていきました。

外部クレートを利用しない方法もありますが、itertools.unique()を使うととても便利です。

コメント

タイトルとURLをコピーしました