将出现的字符替换为字母表中的所有字母

本文关键字:字母表 字符 替换 | 更新日期: 2023-09-27 18:16:07

我创造了一个与电脑对手的拼字游戏。如果在单词生成过程中在计算机机架中发现一个空白块,则需要将其替换为字母表中的每个字母。我有我目前的解决方案来解决这个问题,但我想知道是否有一个更好的更有效的方法来完成这个任务。

if (str.Contains("*"))
                {
                    char c = 'A';
                    String made = "";
                    while(c < 'Z')
                    {
                        made = str.ReplaceFirst("*", c.ToString());
                        if (!made.Contains("*"))
                        {
                            wordsMade.Add(made);
                            if (theGame.theTrie.Search(made) == Trie.SearchResults.Found)
                            {
                                validWords.Add(made);
                            }
                        }
                        else
                        {
                            char ch = 'A';
                            String made2 = "";
                            while (ch < 'Z')
                            {
                                made2 = made.ReplaceFirst("*", c.ToString());
                                wordsMade.Add(made2);
                                if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
                                {
                                    validWords.Add(made2);
                                }
                                ch++;
                            }
                        }
                        c++;
                    }

将出现的字符替换为字母表中的所有字母

Adam是对的,可以重构代码以使其在符号上更小(实际上小得多),但从根本上说,您必须检查通配符的所有26*26组合。因此,虽然有可能使代码在语法上更有效,但我不认为你可以使它在算法上更有效。

这里有很多可以重构的重复代码。

这个例程是重复的,可以放在一个单独的方法中:

wordsMade.Add(made2);
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
{
   validWords.Add(made2);
}

到像这样的

void addWord(string newWordMade){
    wordsMade.Add(newWordMade);
    if (theGame.theTrie.Search(newWordMade) == Trie.SearchResults.Found)
    {
       validWords.Add(newWordMade);
    }
}

这个循环结构也是重复的:

char ch = 'A';
String made2 = "";
while (ch < 'Z')
{
   made2 = made.ReplaceFirst("*", c.ToString());
   wordsMade.Add(made2);
   if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
   {
      validWords.Add(made2);
   }
   ch++;
}

将前面的重构与这个结合起来,使用一个灵巧的lambda,将产生如下内容:

void loopCharactersAndDoThis(Action<char> DoThis) {
    char ch = 'A';
    while (ch < 'Z')
    {
       DoThis(ch);
       ch++;
    }
}
else
{
   loopCharactersAndDoThis(ch => {
      string made2 = made.ReplaceFirst("*", c.ToString());
      addWord(made2);
   });
}

或者只是:

else
{
   loopCharactersAndDoThis(ch => addWord(made.ReplaceFirst("*", c.ToString())));
}