3

我必须写一个刽子手的家庭作业。我们不允许使用任何 char 数组,只能使用 String 方法来操作字符串本身。我遇到的一个问题是当我尝试检查字符串生成器是否有重复项时。

这是我的刽子手方法

public void playHangMan(Scanner guessWord)
{
    int error = 6;
    String letter;
    boolean vali, dup;

    displayHangman();// call displayHangman method

    // get input, lower case input, and then validate in a loop
    do
    {
        letter = guessWord.nextLine();
        letter = lowerGuess(letter); // call lowerGuess method
        vali = letter.matches("[a-z]");

        dup = checkDup(letter); // call checkDup method

        if(vali == false)
        {
            System.out.print("Please enter only a SINGLE letter: ");
        }
        else if(dup == true)
        {
            System.out.print("Duplicated letter, please enter another: ");
        }

        if(dup == false && vali == true)
        {
            this.guessAns.append(letter);
        }

    }
    while(vali == false && dup == false);


}// end playHangman method

我的重复方法:

private boolean checkDup(String letter)
{
    int i;
    boolean dup = false;

    // check guessAns StringBuilder for duplicate letters
    for(i = 0; i <= this.guessAns.length() - 1 && dup == false; i++)
    {
        if(letter.equals(this.guessAns.charAt(i)))
        {
            dup = true;
        }
    }

    if(dup == true)
    {
        return true;
    }
    else
    {
        return false;
    }   
}// end checkDup method

问题是我的 checkDup 方法没有找到任何重复项。我尝试将字母 a 附加到我的字符串生成器中并输入字母的值 a ,但仍然没有运气。是否可以letter.equals(this.guessAns.charAt(i))将字符串与字符进行比较,这就是为什么我的 checkDup 方法无法找到重复项的原因?有人可以解释一下我可以解决这个问题的方法吗?任何帮助将不胜感激。

4

3 回答 3

4

解决此问题的 2 种方法:

letter.charAt(0) == guessAns.charAt(i);

上面的解决方案是在假设letter是一个单一的char.

Character.toString另一种方法是调用char

letter.equals(Character.toString(guessAns.charAt(i)));
于 2013-11-03T04:30:04.730 回答
4

调用String.equals(char)将始终返回 false,因为字符串永远不会与字符进行比较。这样做可以将它们作为字符进行比较:

if(letter.charAt(0) == this.guessAns.charAt(i)) {
于 2013-11-03T04:30:20.617 回答
0

还有另一种检查重复项的方法:使用正则表达式。正则表达式.*([a-z])\1.*将匹配任何在和String之间具有重复字符的字符。更一般地说,将匹配任何具有任何重复字符的字符。az.*(.)\1.*String

dup = letter.matches(".*([a-z])\\1.*");

这是如何工作的:.匹配任何字符并*表示 0 次或多次,因此.*表示任何数量的任何字符(它“消耗”任何数量的字符)。(开始一个小组)结束一组。[a-z]匹配 到 之间a的任何字符z\1是一个反向引用。因此,正则表达式会查找[a-z]紧跟相同字符的任何字符。

注意:如果您要查看String即使分开时是否包含相同的字符,那么这应该有效:.*([a-z]).*\1.*

于 2013-11-03T05:46:49.040 回答