将出现的字符替换为字母表中的所有字母
本文关键字:字母表 字符 替换 | 更新日期: 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())));
}