-4

ボタンを押すと2つのテキストボックス(winformsアプリ)があり、次のコードがあります:

        string new_text = txtnew.Text;
        string old_text = txtold.Text;

        char[] arr_new = new_text.ToCharArray();
        char[] arr_old = old_text.ToCharArray();
        double found  = 0.0;
        double not_found = 0.0;
        foreach (char c_old in arr_old)
        {
            foreach (char c_new in arr_new)
            {
                if (c_new == c_old)
                {
                    found++;
                }else{
                    not_found++;
                }
            }
        }
        double percentage //need help here..
        MessageBox.Show(percentage.ToString());

私がやろうとしているのは、各配列を比較して、ある配列の文字が他の配列に存在するかどうかを確認し、その差をパーセンテージで出力することです。したがって、txtNew = "hello worl" および txtold="hello world" の場合、差は 0.1% のようになりますか? いずれにしても、60% 異なる安全な状態になるまでは、変更を加えるほど違いが大きくなります。

4

3 に答える 3

2

not_found次のように、を合計で割ってパーセンテージを計算できます。

double percentage = (100.0 * not_found) / (found + not_found);

より正確な方法は、文字列間の編集距離を計算し、その距離を元の文字列の長さのパーセンテージで表すことです(つまり、の代わりに編集距離を使用しますnot_found)。

于 2012-11-16T19:14:32.353 に答える
0

このウィキペディアのページを見てみましょう: Damerau-Levenshtein 距離

そのページには、あなたが探しているものを正確に実行すると思われる C# 関数が用意されています。

編集:他の誰かがすでにこの同じアルゴリズムを参照していることに気付きました。重複して申し訳ありません。

于 2012-11-16T20:02:18.300 に答える
0

内側のループで増加not_foundすると、最大 になりold_text.Length*new_text.Lengthます。これにより、膨大な数が生成されnot_found、私が思っているよりもはるかに小さなパーセンテージが得られます.

また、char 配列を処理しても意味がありません。内部は次のIndexOf呼び出しで置き換えることができます。

    string new_text = txtnew.Text;
    string old_text = txtold.Text;

    var found = 0;
    foreach (var c_old in old_text)
    {
        if (new_text.IndexOf(c_old) != -1)
        {
          found++;
        }
    }
    //percentage of characters in the old text that also appear in the new text
    double percentage = (100d * found) / old_text.Length;    
    MessageBox.Show(percentage.ToString());
于 2012-11-16T19:23:38.300 に答える