一个赋值语句的左侧必须是一个变量,charAt方法出现问题。

4
private String kNow(String state, String guess) {
        for (int i = 0; i < word.length(); i++) {
            if (guess.equals(word.charAt(i))) {
                state.charAt(i) = word.charAt(i);
            }
        }
        return state;
    }

state.charAt(i)这部分指出了标题中的问题。如果我的方法并不完全错误,我该如何解决这个问题。


1
什么是 word?你希望这个方法做什么? - Richard Fearn
4个回答

9
这不起作用的原因是charAt(int x) String 类的一个方法,也就是说它是一个函数,在Java中你无法给函数赋值。
如果你想逐个遍历字符串中的字符,我建议这样做:
Char[] GuessAsChar = guess.toCharArray();

然后操作GuessAsChar。根据您的需求,可能有更好(更整洁)的方法来搜索字符串中字符的等价性。

4

不太确定 guess.equals(word.charAt(i)) 的意图是什么,因为这个语句总是会评估为 false,因为一个 String 永远不可能等于一个 char,但是你想将你的 String 转换为 StringBuilder

private String kNow(String state, String guess) {
    final StringBuilder mutable = new StringBuilder(state);
    for (int i = 0; i < word.length(); i++) {
        if (guess.equals(word.charAt(i))) {
            mutable.setCharAt(i, word.charAt(i));
        }
    }
    return mutable.toString();
}

+1 针对指出 if 语句始终失败的观点。我也在我的回答中加上了这一点(比你早了 8 秒 :-P),但这是一个非常重要的观点,我认为你也应该得到赞同。 - Mark Byers
这段代码无法编译。没有声明word - whiskeysierra
我想象 word 是声明类中的一个字段。 - David Blevins

3

在Java中,字符串是不可变对象。这意味着一旦您创建了一个字符串对象,就无法更改它。但是您可以创建一个新的字符串,然后将其重新分配给该变量。

state = state.substring(0, i) + word.charAt(i) + state.substring(i + 1);

然而,在这种情况下,我认为最好使用可变类型的state,例如字符数组(char[])。这样可以直接修改单个字符。
你代码的第二个问题是,guess应该是一个字符,而不是一个字符串。目前你的if语句总是返回false,因为string类型的对象永远不会等于char类型的对象。

3

Java中的字符串是不可变的:一旦创建就不能更改。使用byte[]char[]或集合来处理state可能会更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接