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"))
    //...

もう1つの問題は、==オブジェクト(あなたの場合は文字列)の等価チェックを使用していることです:

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

を使用しないでください。同等性チェックには代わりにメソッドを==使用してください。同一性チェック用です。つまり、参照を比較するだけです。.equals==


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")){}

ベシュ・グルンが言ったように

また、各反復の開始時に readAllOption の値をリセットする必要があります。

do { 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 に答える