提供: 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