提供: Japanese Scratch-Wiki

このきじは ひらがなのページがありません。ごめんなさい。編集者向け:作成する
この記事で扱う文字列の比較とは、2つの文字列を分析し、共通する部分や違っている部分を調べることである。
  • ユーザーが入力した答えを「正解」とくらべて同じ部分と違う部分を調べる
  • 複数のユーザーからのアンケートの回答をクラウドデータに保存しておき、それを分析して表示するアンケート調査プロジェクト

共通しない文字を調べる

2つの異なる変数 の一部の文字が違っている場合、たとえば変数1の値がpotato変数2の値がtomatoの場合、「p」は変数1のみ、「m」は変数2のみに含まれるため、これらの違いは「pm」と表せる。

次に、ブロック定義のパラメーター (引数) として与えられた2つの文字列を比較し、このような違い (2つの変数のどちらか一方でしか使われていない文字) を調べるスクリプトの例を示す。文字列2にあって文字列1にない文字を調べたあと、文字列1にあって文字列2にない文字を調べる (双方向で調べる) 必要があることに注意してほしい。

定義 (文字列1) と (文字列2) の違いを調べる
(すべて v) 番目を [文字一覧 v] から削除する
[i v] を [1] にする
[違っている文字 v] を [] にする //結果を初期化
((文字列1) の長さ) 回繰り返す  //文字列1の文字をリストに入れる
  ((i) 番目\( (文字列1) \)の文字) を [文字一覧 v] に追加する
  [i v] を (1) ずつ変える
end
[i v] を [1] にする
((文字列2) の長さ) 回繰り返す //文字列2の文字を1文字ずつしらべる
  もし <<[文字一覧 v] に ((i) 番目\( (文字列2) \)の文字) が含まれる> ではない> なら 
    [j v] を [1] にする
    [重複 v] を [0] にする
    ((違っている文字) の長さ) 回繰り返す //すでに結果に含まれる文字の場合は重複フラグをたてる
      もし <((i) 番目\( (違っている文字) \)の文字) = ((i) 番目\( (文字列2) \)の文字)> なら 
        [重複 v] を [1] にする
      end
      [j v] を (1) ずつ変える
    end
    もし <(重複) = [0]> なら  //重複がない場合のみ結果に追加
      [違っている文字 v] を ((違っている文字) と ((i) 番目\( (文字列2) \)の文字)) にする
    end
  end
  [i v] を (1) ずつ変える
end
(すべて v) 番目を [文字一覧 v] から削除する
[i v] を [1] にする
((文字列2) の長さ) 回繰り返す   //文字列2の文字をリストに入れる
  ((i) 番目\( (文字列2) \)の文字) を [文字一覧 v] に追加する
  [i v] を (1) ずつ変える
end
[i v] を [1] にする
((文字列1) の長さ) 回繰り返す  //文字列1の文字を1文字ずつしらべる
  もし <<[文字一覧 v] に ((i) 番目\( (文字列1) \)の文字) が含まれる> ではない> なら 
    [j v] を [1] にする
    [重複 v] を [0] にする
    ((違っている文字) の長さ) 回繰り返す 
      もし <((i) 番目\( (違っている文字) \)の文字) = ((i) 番目\( (文字列1) \)の文字)> なら 
        [重複 v] を [1] にする
      end
      [j v] を (1) ずつ変える
    end
    もし <(重複) = [0]> なら 
    [違っている文字 v] を ((違っている文字) と ((i) 番目\( (文字列1) \)の文字)) にする
    end
  end
  [i v] を (1) ずつ変える
end

共通する文字を調べる

2つの文字列に共通する文字が知りたい場合は、先ほどのスクリプトを次のように変更すればよい。

定義 (文字列1) と (文字列2) の違いを調べる
(すべて v) 番目を [文字一覧 v] から削除する
[i v] を [1] にする
[同じ文字 v] を [] にする
((文字列1) の長さ) 回繰り返す 
  ((i) 番目\( (文字列1) \)の文字) を [文字一覧 v] に追加する
  [i v] を (1) ずつ変える
end
[i v] を [1] にする
((文字列2) の長さ) 回繰り返す 
  もし <[文字一覧 v] に ((i) 番目\( (文字列2) \)の文字) が含まれる> なら 
    [j v] を [1] にする
    ((同じ文字) の長さ) 回繰り返す 
      もし <((j) 番目\( (同じ文字)\)の文字) = ((i) 番目\( (文字列2) \)の文字)> なら 
        [重複 v] を [1] にする
      end
      [j v] を (1) ずつ変える
    end
    もし <(重複) = [0]> なら 
      [同じ文字 v] を ((同じ文字) と ((i) 番目\( (文字列2) \)の文字)) にする
    end
  end
  [i v] を (1) ずつ変える
end