尝试生成一个字符串作为单词求解的提示
Posted
技术标签:
【中文标题】尝试生成一个字符串作为单词求解的提示【英文标题】:Trying to Generate a String as a Hint for the Solution to a Word Solve 【发布时间】:2017-03-15 06:06:42 【问题描述】:我正在尝试生成一个字符串作为世界解决方案的提示。
这是我用来生成提示的东西,但我不确定如何纠正这些错误。如果猜测在正确的位置猜到了正确的字符,则提示会显示该字符。如果单词中有字母,则在相应位置显示“+”。如果该字母不在单词中,则返回“*”。
例如,如果谜题的答案是“HARPS”,而猜测是“HELLO”,那么提示将是“H****”。同样,如果猜测是“HEART”,则提示将是“H*++*”。
此外,wordLength 是从另一种方法生成的,该方法给出了解决方案中的字符数量。
public String getHint(String theGuess)
for (int index = 0; index < wordLength; index++)
if **(theGuess.charAt(index)** = solution.charAt(index))
hint.**setCharAt**(index, theGuess.charAt(index));
else if **(theGuess.charAt(index)** = solution.indexOf(solution))
**hint.setCharAt**(index, "+");
else
**hint.setCharAt**(index, "*");
return hint;
错误是双星。
对于 (theGuess.charAt(index) Eclipse 显示以下错误消息:
赋值的左边必须是一个变量。
对于hint.setCharAt,它告诉我:
未为 String 类型定义方法 setCharAt(int, String)。
【问题讨论】:
您收到什么错误消息?你目前得到什么输出? For (theGuess.charAt(index) Eclipse 告诉我“赋值的左侧必须是一个变量。”对于 hint.setCharAt,它告诉我“方法 setCharAt(int, String ) 对于 String 类型是未定义的。" 【参考方案1】:您的代码中有许多问题需要修复:
=
用于为变量分配新值。您想在比较两个值时使用==
。
setCharAt()
是 StringBuilder
的方法,而不是字符串。这个最简单的解决方案是使用+=
将新字符连接到字符串。
如果要使用StringBuilder,需要修复以下部分:
setCharAt()
的第二个参数应该是一个字符,而不是一个字符串。您需要将"*"
和"+"
周围的双引号更改为'*'
等单引号
setCharAt()
尝试替换特定索引处的字符。如果 StringBuilder 比您尝试替换的索引位置短,这将引发错误。您可以通过立即将 StringBuilder 设置为长度正确的字符串来解决此问题,例如hint = new StringBuilder("*****")
。
由于您总是添加构建器的末尾,因此您应该只使用append()
而不是setCharAt()
,您不必担心这个索引位置问题。
(theGuess.charAt(index) == solution.indexOf(solution)
不会搜索整个 solution
字符串以查看它是否包含当前字符。相反,您可以使用indexOf()
来检查字符串是否包含该字符。此链接可能会有所帮助:How can I check if a single character appears in a string?
这是一个完整的程序,代码可以运行:
public class HelloWorld
public static void main(String[] args)
OtherClass myObject = new OtherClass();
System.out.print(myObject.getHint("HEART"));
选项 1 - 使用 +=
添加到字符串:
public class OtherClass
private String solution = "HARPS";
private int wordLength = 5;
public String getHint(String theGuess)
String hint = "";
for (int index = 0; index < wordLength; index++)
if (theGuess.charAt(index) == solution.charAt(index))
hint += theGuess.charAt(index);
else if (solution.indexOf(theGuess.charAt(index)) > 0)
hint += "+";
else
hint += "*";
return hint;
选项 2 - 使用 StringBuilder:
public class OtherClass
private StringBuilder hint;
private String solution = "HARPS";
private int wordLength = 5;
public String getHint(String theGuess)
hint = new StringBuilder();
for (int index = 0; index < wordLength; index++)
if (theGuess.charAt(index) == solution.charAt(index))
hint.append(theGuess.charAt(index));
else if(solution.indexOf(theGuess.charAt(index)) > 0)
hint.append('+');
else
hint.append('*');
return hint.toString();
【讨论】:
连接字符串不起作用,因为他需要它只显示来自该猜测的提示,而不是它和所有以前的猜测。 @sub6resources 通过在getHint()
方法中移动hint
变量来解决这个问题。现在,每次调用 getHint()
方法时,它都会重置为空白字符串。 StringBuilder
也可以使用,但似乎 OP 想要一个简单的初学者解决方案。【参考方案2】:
这段代码应该可以工作:
public String getHint(String theGuess)
StringBuilder hintBuilder = new StringBuilder(hint);
for (int index = 0; index < wordLength; index++)
if (theGuess.charAt(index) == solution.charAt(index))
hintBuilder.setCharAt(index, theGuess.charAt(index));
else if(theGuess.charAt(index) == solution.indexOf(string))
hintBuilder.setCharAt(index, "+");
else
hintBuilder.setCharAt(index, "*");
return hintBuilder;
基本上,您必须使用“StringBuilder”,因为字符串是不可变的,这意味着一旦构建它们就无法更改。
另外,比较两个值时,请使用==
或===
进行比较,而不是=
。
更新
我忘记了字符串在 Java 中是不可变的,并且已经更新了代码以便它可以工作。
【讨论】:
它仍然告诉我hint.charAt(index) 不是一个变量,所以我仍然得到一个错误。否则,它看起来不错! 啊,是的,我忘了你不能在创建 Java 字符串后更改它们。您必须创建一个替换字符的新字符串。我会在一分钟内更新新代码。 这不起作用,因为您不能分配给方法调用。 此解决方案仍然解决了代码的所有问题,但似乎无法编译。 我并没有试图让它编译,只是获取问题中的代码,并对其进行更改以确保没有错误;这就是问题所要求的。以上是关于尝试生成一个字符串作为单词求解的提示的主要内容,如果未能解决你的问题,请参考以下文章
算法leetcode|1967. 作为子字符串出现在单词中的字符串数目(rust和go重拳出击)
算法leetcode|1967. 作为子字符串出现在单词中的字符串数目(rust和go重拳出击)