提供:Japanese Scratch-Wiki
このきじは ひらがなでよめません。ごめんなさい。編集者向け:作成する
この記事で扱う文字列の比較とは、2つの文字列を分析し、共通する部分や違っている部分を調べることである。
共通しない文字を調べる
2つの異なる変数 の一部の文字が違っている場合、たとえば変数1
の値がpotato
、変数2
の値がtomato
の場合、「p」は変数1
のみ、「m」は変数2
のみに含まれるため、これらの違いは「pm」と表せる。
次に、ブロック定義のパラメーター (引数) として与えられた2つの文字列を比較し、このような違い (2つの変数のどちらか一方でしか使われていない文字) を調べるスクリプトの例を示す。文字列2にあって文字列1にない文字を調べたあと、文字列1にあって文字列2にない文字を調べる (双方向で調べる) 必要があることに注意してほしい。
定義 (文字列1) と (文字列2) の違いを調べる [文字一覧 v] のすべてを削除する [i v] を [1] にする [違っている文字 v] を [] にする //結果を初期化 ((文字列1) の長さ) 回繰り返す //文字列1の文字をリストに入れる ((文字列1) の (i) 番目の文字) を [文字一覧 v] に追加する [i v] を (1) ずつ変える end [i v] を [1] にする ((文字列2) の長さ) 回繰り返す //文字列2の文字を1文字ずつしらべる もし <<[文字一覧 v] に ((文字列2)の(i)番目の文字) が含まれる> ではない> なら [j v] を [1] にする [重複 v] を [0] にする ((違っている文字) の長さ) 回繰り返す //すでに結果に含まれる文字の場合は重複フラグをたてる もし <((違っている文字)の(i)番目の文字) = ((文字列2)の(i)番目の文字)> なら [重複 v] を [1] にする end [j v] を (1) ずつ変える end もし <(重複) = [0]> なら //重複がない場合のみ結果に追加 [違っている文字 v] を ((違っている文字) と ((文字列2)の(i)番目の文字)) にする end end [i v] を (1) ずつ変える end [文字一覧 v] のすべてを削除する [i v] を [1] にする ((文字列2) の長さ) 回繰り返す //文字列2の文字をリストに入れる ((文字列2)の(i)番目の文字) を [文字一覧 v] に追加する [i v] を (1) ずつ変える end [i v] を [1] にする ((文字列1) の長さ) 回繰り返す //文字列1の文字を1文字ずつしらべる もし <<[文字一覧 v] に ((文字列1)の(i)番目の文字) が含まれる> ではない> なら [j v] を [1] にする [重複 v] を [0] にする ((違っている文字) の長さ) 回繰り返す もし <((違っている文字)の(i)番目の文字) = ((文字列1)の(i)番目の文字)> なら [重複 v] を [1] にする end [j v] を (1) ずつ変える end もし <(重複) = [0]> なら [違っている文字 v] を ((違っている文字) と ((文字列1)の(i)番目の文字)) にする end end [i v] を (1) ずつ変える end
共通する文字を調べる
2つの文字列に共通する文字が知りたい場合は、先ほどのスクリプトを次のように変更すればよい。
定義 (文字列1) と (文字列2) の違いを調べる [文字一覧 v] のすべてを削除する [i v] を [1] にする [同じ文字 v] を [] にする ((文字列1) の長さ) 回繰り返す ((文字列1)の(i)番目の文字) を [文字一覧 v] に追加する [i v] を (1) ずつ変える end [i v] を [1] にする ((文字列2) の長さ) 回繰り返す もし <[文字一覧 v] に ((文字列2)の(i)番目の文字) が含まれる> なら [j v] を [1] にする ((同じ文字) の長さ) 回繰り返す もし <((同じ文字)の(j)番目の文字) = ((文字列2)の(i)番目の文字)> なら [重複 v] を [1] にする end [j v] を (1) ずつ変える end もし <(重複) = [0]> なら [同じ文字 v] を ((同じ文字) と ((文字列2)の(i)番目の文字)) にする end end [i v] を (1) ずつ変える end