Rust での配列操作、重複する要素を削除する方法を解説します。
重複を削除する方法
- HashSet を活用する
- 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パターンで配列の中の重複を削除することができました。
参考
著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
				
									
						¥3,208						(2025/09/16 12:23時点 | Amazon調べ)
					
				
							 ポチップ
					ポチップ
				

 
					
コメント