尝试生成一个字符串作为单词求解的提示

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 字符串后更改它们。您必须创建一个替换字符的新字符串。我会在一分钟内更新新代码。 这不起作用,因为您不能分配给方法调用。 此解决方案仍然解决了代码的所有问题,但似乎无法编译。 我并没有试图让它编译,只是获取问题中的代码,并对其进行更改以确保没有错误;这就是问题所要求的。

以上是关于尝试生成一个字符串作为单词求解的提示的主要内容,如果未能解决你的问题,请参考以下文章

Java 求解单词搜索

算法leetcode|1967. 作为子字符串出现在单词中的字符串数目(rust和go重拳出击)

算法leetcode|1967. 作为子字符串出现在单词中的字符串数目(rust和go重拳出击)

C语言,输入一行文字,单词间以空格分隔,然后分离其中的单词按每行一个单词输出,程序有了,求解释

如何检查两个字符串是不是是字谜?

数据结构与算法之深入解析“串联所有单词的子串”的求解思路与算法示例