百名山 API を開発しました | mountix APICLICK !

Rust | 要素がプリミティブ型であるVector型で重複する要素を削除する

Rust Vec sort HashSet dedup
  • URLをコピーしました!

Rust での配列操作、重複する要素を削除する方法を解説します。

重複を削除する方法

  1. HashSet を活用する
  2. dedup 関数を活用する
目次

Vector型の重複削除

要素がプリミティブ型であるVector型で重複する要素を削除していきます。

HashSet

HashSet<T>は、HashMap<T,()>のラッパーで、値を持たないキーだけの HashMap です。

HashSet の大きな特徴は、要素に重複がないということが保証されているという点です。

use std::collections::HashSet;
use std::iter::FromIterator;

fn main() {
    let vec = vec!["a", "b", "b", "c", "b", "d", "e"];
    let unique: HashSet<&str> = vec.into_iter().collect();

    // HashSet to Vector
    let mut vec_unique = Vec::from_iter(unique);
    // uniqueで順番が保証されていないのでソートする
    vec_unique.sort();

    assert_eq!(vec!["a", "b", "c", "d", "e"], vec_unique);
}

VectorをHashSetに変換した際に、順番が保証されなくなります。

順番を保証する場合には上記サンプルコードのようにsortしましょう。

dedup

dedup 関数を使用すれば、連続する重複要素を削除することができます。

連続する、という点がポイントです。

すべての重複を削除するには事前にsortしておく必要があります。

fn main() {
    let mut vec = vec!["a", "b", "b", "c", "b", "d", "e"];

    // 完全に重複を削除するにはsortしておく
    vec.sort();
    vec.dedup();

    assert_eq!(vec!["a", "b", "c", "d", "e"], vec);
}

sortしない場合、1番目と2番目の"b"が連続しているので、この部分の重複は削除されます。

ただし、"c"のあとの4番目の"b"は削除されず残ります。

fn main() {
    let mut vec = vec!["a", "b", "b", "c", "b", "d", "e"];

    // sortしない
    // vec.sort();
    vec.dedup();

    assert_eq!(vec!["a", "b", "c", "b", "d", "e"], vec);
}

まとめ

重複をすべて削除する!という関数はありませんが、2パターンで配列の中の重複を削除することができました。

参考

著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
¥1,782 (2022/10/05 16:03時点 | Amazon調べ)
Rust Vec sort HashSet dedup

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次