Rust 文字列のアクセス chars, nth, collect, []
概要
- 文字列のn番目にアクセスするには nth(数) を使う。
- 長い文字列ほどアクセスに時間がかかる。
- char の配列にするという手もある。
プログラム例
- 文字列「あいうえおかきくけこさしすせそ」について。
- 10番目の文字を表示する。
fn main() { let 文字列 = "あいうえおかきくけこさしすせそ"; match 文字列.chars().nth(10) { Some(文字) => println!("{}", 文字), _ => () } }
解説
- nth(10) で文字列の10番目を辿っている。
- 10番目というと「こ」になりそうだが、実際には「さ」。
- 0番目が先頭なので、添え字と文字の関係は以下のようになる。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
あ | い | う | え | お | か | き | く | け | こ | さ | し | す | せ | そ | (無し) |
- 文字によってデータの長さが違う。英数字=1、ロシア語=2、日本語=3(バイト)。
- そのため、n文字目が何かを調べるたびに、先頭から調べていく必要がある。
- n文字目が先頭から遠いほど、アクセスが遅くなる。
ランダムな場所にアクセスする場合
- すべての文字を char(長さ8バイト)の配列に入れなおす。この作業は遅い。
- 一度やってしまえば、どの文字も長さ8なので、指定の場所に一瞬でアクセスできる。
fn main() { let 文字列 = "あいうえおかきくけこさしすせそ"; let 文字配列: Vec<char> = 文字列.chars().collect(); println!("{}", 文字配列[10]); }
先頭から順にアクセスする場合
- わざわざすべての文字を配列に入れなおす必要はない。
- for を使って、先頭から1文字ずつ取り出していく方法が最も効率的。
fn main() { let 文字列 = "あいうえおかきくけこさしすせそ"; for 文字 in 文字列.chars() { println!("{}", 文字); } }