0

我无法让 do-while 循环成功地将整数更改为 if 语句中的值。如果我输入' y '或' n ',它将正确退出循环,但整数的值将保持为0。

我使用子字符串来允许用户输入诸如“ yes ”或“ YEs ”之类的内容,甚至“ Y3$ir ”,并且仍然等同于java的“ y ”。

代码:

import java.util.Scanner;
public class aTaskforAll
{
    public static void main (String [] args)
    {
        Scanner scan = new Scanner(System.in);
        String readAll;

        int readAllOption = 0;

        do {
            System.out.print("Do you want the words printed? (y/n) ");
            readAll = scan.nextLine();
            System.out.println(readAll.substring(0));

            if ((readAll.substring(0) == "y") || (readAll.substring(0) == "Y"))
                readAllOption = 1;
            else if ((readAll.substring(0) == "n") || (readAll.substring(0) == "N"))
                readAllOption = 2;
        }
        while (readAllOption != 0);

        System.out.println(readAllOption);    //Tester

        //Go on to do task in response to readAllOption = 1 or 2
    }
}
4

5 回答 5

1

String.substring(int)方法不会像您认为的那样做。

以下是文档中的内容:

返回一个新字符串,它是该字符串的子字符串。子字符串以指定索引处的字符开始并延伸到该字符串的末尾。

所以,readAll.substring(0)会给你一个子字符串,它基本上包含原始字符串中的所有字符。

您的用例的正确方法是String.substring(int,int).

从文档

返回一个新字符串,它是该字符串的子字符串。子字符串从指定的 beginIndex 开始并延伸到索引 endIndex - 1 处的字符。因此子字符串的长度是 endIndex-beginIndex。

所以,readAll.substring(0, 1)会给你一个只有第一个字符的子字符串。

String.startsWith(String)或者使用方法会更好(更清洁)

if (readAll.startsWith("y") || readAll.startsWith("Y"))
    //...

另一个问题是使用==对象(在您的情况下为字符串)相等性检查:

//...
if ((readAll.substring(0) == "y") || (readAll.substring(0) == "Y"))
//...
else if ((readAll.substring(0) == "n") || (readAll.substring(0) == "N"))
//...

不要使用==, 使用.equalsmethod 代替进行相等性检查。==用于身份检查,这意味着只是比较参考。


readAllOption此外,您应该在每次迭代开始时重置 的值:

do {
    readAllOption = 0;

退出循环。

于 2013-03-07T06:10:37.850 回答
1

首先,您的终止条件是倒退的。

你要

do {
  stuff...
}
while (readAllOption  == 0)

正如所写,它只会在 readAllOption == 0 时退出循环。您需要在每个循环开始时将其设置为 0。

其次,readAll.subString(0)返回整个字符串。您想要readAll.charAt(0),并将其与字符“Y”或“N”进行比较。

我不知道这段代码是如何远程为你工作的。

于 2013-03-07T06:11:47.580 回答
1

对于字符串,您需要使用.equals("y")not==并且您没有子字符串的结束索引。像这样

if (readAll.substring(0, 1).equals("y")){}

正如Bhesh Gurung所说

此外,您应该在每次迭代开始时重置 readAllOption 的值:

做{ readAllOption = 0;

也正如用户 user949300 所说

你的终止条件是倒退的。

你要

do { stuff... } while (readAllOption == 0) 正如写的那样,它只会在 readAllOption == 0 时退出循环

于 2013-03-07T06:12:40.403 回答
1

在比较字符串时使用.equals()而不是。==

只获取第一个字符也可以(而且效率更高):

readAll.charAt(0) == 'y'

于 2013-03-07T06:12:44.900 回答
0

让你的代码像这样。保持它的完整性。

import java.util.Scanner;
public class aTaskforAll
  {
  public static void main (String [] args)
    {
    Scanner scan = new Scanner(System.in);
    String readAll;

    int readAllOption = 0;

    do {
        System.out.print("Do you want the words printed? (y/n) ");
        readAll = scan.nextLine();
        System.out.println(readAll.substring(0));

        if ("y".equals(readAll.substring(0,1).toLowerCase())
            readAllOption = 1;
        else if ("n".equals(readAll.substring(0,1).toLowerCase())
            readAllOption = 2;
        }
    while (readAllOption != 0);

    System.out.println(readAllOption);    //Tester

    //Go on to do task in response to readAllOption = 1 or 2
   }
}
于 2013-03-07T06:33:53.630 回答