【问题标题】:Add value to integer in do-while loop在 do-while 循环中为整数添加值
【发布时间】:2013-03-07 06:08:58
【问题描述】:

我无法让 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
    }
}

【问题讨论】:

    标签: java loops if-statement do-while


    【解决方案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"))
    //...
    

    不要使用==,而是使用.equals 方法进行相等检查。 == 用于身份检查,这意味着只是比较参考。


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

    do {
        readAllOption = 0;
    

    退出循环。

    【讨论】:

    • -1 readAll.substring(0) 什么都不做。它返回整个字符串。
    • 我喜欢在这种情况下使用 .startsWith。谢谢!
    • @BheshGurung 您的原始答案有误(子字符串 args)。与其添加更正作为修改,不如修复原始问题。
    • 我的意思是你应该编辑你的答案,让它看起来好像你从一开始就拥有所有正确的信息。目的是使答案对后来搜索的其他人以及 OP 尽可能有用。不要让其他人在阅读时必须在心理上跟踪变化。
    • @JimGarrison:同意。我已经编辑过了。我希望这次看起来更好。如果我仍然遗漏了什么,请告诉我。
    【解决方案2】:

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

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

    readAll.charAt(0) == 'y'

    【讨论】:

    • +1 for charAt()。 -1 表示它更有效。问题是 readAllOption.subString(0) 是完全错误的......
    • @user949300:感谢您的意见。怎么不更有效率? subString() 创建一个新的字符串对象,而 charAt() 是一个返回字符的常量时间操作。
    • 除非他每秒循环调用 100000 次,否则没关系。 (但是,基本上你错过了效率问题)
    • (虽然我可能把你的帖子和其他帖子搞混了……)
    • @user949300:我认为从括号的使用中可以明显看出它更像是“嘿,只是这样你知道这更有效”类型的东西。就您而言,在这种情况下使用 charAt() 不会提供性能优势。但是,我认为当他的任务变得更加复杂时,这些信息可能对 OP 有用。停止一个复杂的算法来分配内存而不是一个恒定时间的方法调用?只是觉得它可能会变得有用。
    【解决方案3】:

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

    你想要

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      正如Bhesh Gurung所说

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

      做{ readAllOption = 0;

      也如用户user949300所说

      你的终止条件是倒退的。

      你想要

      做{ 东西... } 而(readAllOption == 0) 正如所写,它只会在 readAllOption == 0 时退出循环

      【讨论】:

      • @Bhesh Gurung 打败了我
      • 哈哈,谢谢!我确实使用了你的想法来结束循环。
      【解决方案5】:

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

      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
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-02-16
        • 1970-01-01
        • 2023-03-12
        • 2020-03-19
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        相关资源
        最近更新 更多