Rustで文字列のソートをしてみた
String, &strには組み込みでソート関数が用意されていないようなので書いてみた。
fn main() {
let x = "test";
let mut it: Vec<_> = x.chars().collect();
let mut y = String::new();
it.sort();
for c in it {
y.push(c);
}
let y: &str = y.as_str();
println!("{}", y);
}
一応動作はするものの、美しくない書き方な気がする。
特にString作ってpushしてるあたりがもっと簡単な書き方とかないんだろうか?
ご存知の方、こんなコードより良いコードを思いついた方、どうか教えて下さい。
あとUTF-8でどんな動作するのかは謎、一応アルファベットならとりあえずはソートできてる。
補足
コメントでより良い書き方の例をいただけました。
// for c in it {
// y.push(c);
//}
let y: String = chars.into_iter().collect();
これならyをミュータブルにする必要もなく、コードもスッキリして見えます。
UTF-8の場合についてコメントで情報をいただけたので、その点について補足します。
rustではデフォルトでUTF-8を使いますが、UTF-8では1文字に見えても1文字でないみたいな文字が存在しているため、ソートなどで順番が変わると元の文字とは違う字が出現する可能性があります。
rustは全て1文字としてUnicodeのスカラ値として解釈してソートするため、一般的には正しくないと思われる動作になります。
具体的な例もコメントで確認できます。
アルファベットに関しては正しくソートできるはずです。