1

説明下手ですが頑張ります。

入力した単語を別の単語に変換する小さなプログラムを作成しています。入力された各文字は、コードのこのセクションを通過し、単語全体のインデックス位置に応じて別の文字に変更されます。

ここでの問題は、繰り返し文字がある場合、繰り返し文字は単語内の位置に応じて変化するのではなく、最初の出現に応じて変化することです。

たとえば、これは「bacca」という単語を作ったものです。それをコードに入れると、「vrwiy」に変更する必要がありますが、代わりに「vrwwr」に変更します。これもなぜだかわかります。これは、変換が必要な単語を switch ステートメントがループするためです。ただし、文字列のインデックス内の個々の位置に応じて各文字を変更する方法についての手がかりがありません。おそらく LastIndexOf() メソッドが機能すると思いましたが、代わりに順序を逆にするだけです。したがって、文字「a」を入力すると「n」と表示されますが、「aa」と入力すると、最初の「a」が「r」に切り替わります。2 番目の文字は IndexOf にあるためです。 1 get を "r" に変更します。

private void inputTbox_TextChanged(object sender, EventArgs e)
{
    List<string> rawZnWordList = new List<string>();
    foreach (char a in inputTextBox.Text) 
    {
        switch (inputTextBox.Text.IndexOf(a)) 
        {
            case 0: 
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("n");
                        continue;
                    case 'b':
                        rawZnWordList.Add("v");
                        continue;
                    case 'c':
                        rawZnWordList.Add("a");
                        continue;
                    default:
                        break;
                }

                continue;
            case 1:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("r");
                        continue;
                    case 'b':
                        rawZnWordList.Add("x");
                        continue;
                    case 'c':
                        rawZnWordList.Add("z");
                        continue;
                    default:
                        break;
                }
                continue;
            case 2:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("t");
                        continue;
                    case 'b':
                        rawZnWordList.Add("l");
                        continue;
                    case 'c':
                        rawZnWordList.Add("w");
                        continue;
                    default:
                        continue;
                }
                continue;
            case 3:
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("u");
                        continue;
                    case 'b':
                        rawZnWordList.Add("i");
                        continue;
                    case 'c':
                        rawZnWordList.Add("o");
                        continue;
                    default:
                        break;
                }
                continue;
            case 4:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("y");
                        continue;
                    case 'b':
                        rawZnWordList.Add("m");
                        continue;
                    case 'c':
                        rawZnWordList.Add("d");
                        continue;
                    default:
                        break;
                }
                continue;
            default:
                break;
        }
    }
    string finalZnWord = string.Join("", rawZnWordList.ToArray()); 
    outputTextBox.Text = finalZnWord;
}
4

3 に答える 3

1

for次のように、代わりにループを使用してみてください。

for (int i = 0; i < inputTextBox.Text.Length; i++) 
    {
        char a = inputTextBox.Text[i];
        switch (i) 
        {
            case 0: 
                switch (a) 
                ...

お役に立てれば ;)。

于 2013-03-31T04:29:21.063 に答える
0

foreachを使用する代わりに、内部のインデックスを追跡する必要があります.IndexOf。a の代わりに通常のforループを使用することもできますforeachが、この方法はコードの変更を最小限に抑えます。

private void inputTbox_TextChanged(object sender, EventArgs e)
{
    List rawZnWordList = new List();
    int index = 0;
    foreach (char a in inputTextBox.Text) 
    {
        switch (index) 
        {
            case 0: 
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("n");
                        continue;
                    case 'b':
                        rawZnWordList.Add("v");
                        continue;
                    case 'c':
                        rawZnWordList.Add("a");
                        continue;
                    default:
                        break;
                }
                continue;
            case 1:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("r");
                        continue;
                    case 'b':
                        rawZnWordList.Add("x");
                        continue;
                    case 'c':
                        rawZnWordList.Add("z");
                        continue;
                    default:
                        break;
                }
                continue;
            case 2:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("t");
                        continue;
                    case 'b':
                        rawZnWordList.Add("l");
                        continue;
                    case 'c':
                        rawZnWordList.Add("w");
                        continue;
                    default:
                        continue;
                }
                continue;
            case 3:
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("u");
                        continue;
                    case 'b':
                        rawZnWordList.Add("i");
                        continue;
                    case 'c':
                        rawZnWordList.Add("o");
                        continue;
                    default:
                        break;
                }
                continue;
            case 4:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("y");
                        continue;
                    case 'b':
                        rawZnWordList.Add("m");
                        continue;
                    case 'c':
                        rawZnWordList.Add("d");
                        continue;
                    default:
                        break;
                }
                continue;
            default:
                break;
        }
        index++;
    }
    string finalZnWord = string.Join("", rawZnWordList.ToArray()); 
    outputTextBox.Text = finalZnWord;
}

于 2013-03-31T04:25:55.210 に答える
0

これは同じことを行い、はるかに読みやすいと思います。もちろん、文字リングを独自の値に置き換えます。5キャラまでしか行けなかった。もっと欲しくなると思います。

//replacement letter rings
char[][] aRep = { 
    "xfhygaodsekzcpubitlvnjqmrw".ToCharArray(),
    "wqtnsepkbalmzyxvordhjgifcu".ToCharArray(),
    "nyxgmcibplovkwrszaehftqjud".ToCharArray(),
    "soqjhpybuwfxvartkzginemdcl".ToCharArray(),
    "pldquhegkaomcnjrfxiysvtbwz".ToCharArray(),
};
private string newText(string inVal)
{
    char[] ia = inVal.ToCharArray(); //in array
    int l = ia.Length;
    char[] oa = new char[l]; //out array
    for (int i = 0; i < l; i++)
        oa[i] = aRep[i][(int)ia[i]-97]; //lowercase starts at char97
    return new string(oa);
}

リングを生成するために使用したコードも次のとおりです。

//generate random letter rings
//char[] ascii = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
//for (int i = 0; i < 8; i++)
//  new string(ascii.OrderBy (x => Guid.NewGuid() ).ToArray()).Dump();

私はいくつかの非常に簡単なテストを行いましたが、これは元のアプローチよりもかなり高速であるように見えました。さらに重要なことは、(私にとって)より読みやすく、置換文字シーケンスを確認するのがはるかに簡単であることです。もう少し最適化を行う必要があると思いますが、これは良いスタートだと思います。「変更時」にテキストでこれを呼び出すだけです。

于 2013-03-31T06:25:00.060 に答える