0

我是一个初学者程序员,我正在尝试制作一个非常简单的 Hangman 版本。我的代码有问题。这是我遇到问题的代码部分:

        for(int i = 0; i <= wordLength - 1; i++ ) {

            if (letter == theWord.charAt( i )) {

                onemore=i+1;
                System.out.println("This letter matches with letter number " + onemore + " in the word.");
                ***displayWord.charAt(i)=letter;***
                System.out.println("The word so far is " + displayWord);
            } 

        }

我遇到错误的部分两边都有 3 个星号。

displayWord 是一个字符串,而字母是一个字符。

Netbeans 告诉我:

unexpected type
  required: variable
  found:    value

我不知道问题是什么。

4

4 回答 4

4

基本上,JavaString是不可变的,即内容不能改变。

你最好使用StringBuilder.

String theWord = "This is a simple test";
char letter = 'i';
char changeTo = '-';

StringBuilder displayWord = new StringBuilder(theWord);

int i = theWord.indexOf(letter);
if (i != -1) {
    System.out.println("This letter matches with letter number " + (i + 1) + " in the word.");
    displayWord.setCharAt(i, changeTo);

    System.out.println("The word so far is " + displayWord);
}

System.out.println(displayWord);

这导致:

This letter matches with letter number 3 in the word.
The word so far is Th-s is a simple test
This letter matches with letter number 6 in the word.
The word so far is Th-s -s a simple test
This letter matches with letter number 12 in the word.
The word so far is Th-s -s a s-mple test
Th-s -s a s-mple test

现在简短的版本可能看起来像

String displayWord = theWord.repace(letter, changeTo);
于 2012-08-09T03:27:23.600 回答
0

我不确定那个错误,但在 Java 中你不能以这样的样式更新字符。

相反,请尝试使用StringBuilder您的 displayWord。那有一个方法:setCharAt那可能就是你想要的。

祝你编码好运:)

于 2012-08-09T03:27:46.613 回答
0

charAt(i) 返回单词那部分字母的值,你不能用它来改变值。Java 中的字符串是不可变的,因此您实际上无法更改它。您可以创建一个新的(使用构造函数或可能的 replaceXXX 函数之一)并将其分配回 displayWord,或查看对此类事物更有效的StringBuffer类。

于 2012-08-09T03:30:20.900 回答
0

由于String是不可变对象,因此您无法更改其内容。不可变意味着一旦String设置了内容,你就没有能力以任何方式改变它。您始终可以更改参考,但不能更改内容本身。

话虽如此,该String对象并未提供任何违反此原则的方法。没有setCharAt,您不能为 的结果分配新值charAt(i)。请注意,一些“似乎”改变String(like replace) 的方法是如何返回一个新的克隆对象并对其进行更改。例如:

String sample = "Hello World!";
sample.replace('e', '*');
System.out.println(sample);

上面的代码没有做任何改动sample,所以屏幕上打印的结果会是Hello World!。为了捕获replace方法所做的更改,我们需要将sample变量重新分配给结果replace

String sample = "Hello World!";
sample = sample.replace('e', '*');
System.out.println(sample);

在这种情况下,我们将使用由返回sample的新克隆更新我们的变量。这个值会有变化,所以我们会看到打印出来的。StringreplaceH*llo World!

既然你知道了为什么不能改变你String的 s 的内容,那么让我们看看你有什么解决方案。

  1. 首先,要保持程序的确切行为,完美的方法是使用StringBuilder之前指出的@MadProgrammer。查看StringBuilder类的过于简单化的方式基本上是 mutable String。有了它,您可以进行各种替换和修改。

  2. 另一种解决方案(但不推荐)是String每次要更改角色时都使用 来创建新副本。这将非常麻烦,并且与StringBuilder解决方案相比没有任何优势,因此我不打算详细介绍。

  3. 第三种解决方案取决于您的要求以及您的灵活性。String如果您要做的只是替换replace. 它会是这样的:

    String theWord = "这是我们的测试字符串"; 字符字母 = 'e'; char changeTo = '*'; 字符串 displayWord = theWord.replace(letter, changeTo); System.out.println("得到的单词是:" + displayWord);

这将输出以下结果:

The resulting word is: H*r* is our t*sting string

同样,这仅在您的要求足够灵活并且您可以跳过示例代码中遵循的“逐步”方法的情况下才有效。

于 2012-08-09T04:06:32.920 回答