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 (2024/11/22 22:08時点 | Amazon調べ)
ポチップ
コメント