]>
<< 来年の目標 | main | The Java Programming Language, Fourth Edition >>
文字列のスライシングについて、ちょっと考えて納得した。
![]()
s = ' 0123456789 'とすると、こんなデータ構造が作られる。データ構造の上下に振られた添え字はそれぞれスライシングの開始地点、終端地点である。
s[ 0 : 0 ]のとき、開始地点 = 終端地点であるので、スライシングは行われない。
s[ 0 : 3 ]のとき、上の添え字 0 から右下に矢印を伸ばし、データ『 0 』をとってくる。
一番目の添え字に 1 を足し、s[ 1 : 3 ]とする。
上の添え字 1 から右下に矢印を伸ばし、データ『 1 』をとってくる。
一番目の添え字に 1 を足し、s[ 2 : 3 ]とする。
上の添え字 0 から右下に矢印を伸ばし、データ『 2 』をとってくる。
一番目の添え字に 1 を足し、s[ 3 : 3 ]とする。
s[ 3 : 3 ]のとき、開始地点 = 終端地点であるので、スライシングは行われない。
s[ 4 : 7 : 2 ]のとき、上の添え字 4 から右下に矢印を伸ばし、データ『 4 』をとってくる。
一番目の添え字に 2 を足し、s[ 6 : 7 : 2 ]とする。
上の添え字 6 から右下に矢印を伸ばし、データ『 6 』をとってくる。
一番目の添え字に 2 を足し、s[ 8 : 7 : 2 ]とする。
s[ 8 : 7 : 2 ]のとき、開始地点 > 終端地点であるので、スライシングは行われない。
![]()
s[ 0 : 10 : 3 ] も同じように考えられる。
![]()
三つ目のインデックスが負のときは終了判定が逆になる。
s[ 1 : 0 : -1 ]のとき、上の添え字 1 から右下に矢印を伸ばし、データ『 1 』をとってくる。
一番目の添え字に -1 を足し、s[ 0 : 0 : -1 ]とする。
s[ 0 : 0 : -1 ]のとき、開始地点 = 終端地点であるので、スライシングは行われない。
s[ 9 : 3 : -2 ]のとき、上の添え字 9 から右下に矢印を伸ばし、データ『 9 』をとってくる。
一番目の添え字に -2 を足し、s[ 7 : 3 : -2 ]とする。
上の添え字 7 から右下に矢印を伸ばし、データ『 7 』をとってくる。
一番目の添え字に -2 を足し、s[ 5 : 3 : -2 ]とする。
上の添え字 5 から右下に矢印を伸ばし、データ『 5 』をとってくる。
一番目の添え字に -2 を足し、s[ 3 : 3 : -2 ]とする。
s[ 3 : 3 : -2 ]のとき、開始地点 = 終端地点であるので、スライシングは行われない。
つまり s[ a : b : c ] を求めるアルゴリズムとしては、
1. A = ' ' とする。
2. 配列の添え字 a , b が有効な範囲にあるか確かめ、範囲を超えていれば境界をその値として振りなおす。
3. c が正のとき、a <= b なら終了、c が負のとき、a => b ならば終了。A を出力する。
4. A += s[ a ]。
5. a += c として、A = A + s[ a : b : c ] を求める。
http://www.panopticon.jp/mt/mt-tb.cgi/26
コメントする