web-dev-qa-db-ja.com

Java Scannerメソッド "hasNext"を条件としてwhileループから抜け出す方法は?

私はJavaプログラミングで初心者です。奇妙な問題に遭遇しました。以下は、入力をユーザーに求め、ユーザーが一度に1つのWordを入力する内容を出力するコードです。

問題は、プログラムが決して終わらないことであり、私の限られた理解から、whileループの中に詰まっているようです。誰かが私を少し助けてもらえますか?前もって感謝します。

import Java.util.Scanner;

public class Test{
   public static void main(String args[]){
      System.out.print("Enter your sentence: ");
      Scanner sc = new Scanner (System.in);

      while (sc.hasNext() == true ) {
        String s1 = sc.next();
        System.out.println(s1);
      }

      System.out.println("The loop has been ended"); // This somehow never get printed.
   }
}
14
Synia

新しい文字列を取得し続け、空でない場合はループを継続します。終了文字列のループにコントロールを挿入するだけです。

while(!s1.equals("exit") && sc.hasNext()) {
    // operate
}

ループ内で文字列を宣言し、文字列が「exit」の場合にループ本体で操作を行わない場合:

while(sc.hasNext()) {
    String s1 = sc.next();
    if(s1.equals("exit")) {
        break;
    }
    //operate
}
17
İsmet Alkan

Scannerは、「ファイルの終わり」条件が見つかるまで読み続けます。

stdinから読んでいるとき、それはEOF文字(Unixでは通常^d)]を送信するか、または<スタイルのリダイレクトを使用する場合はファイル。

8
Alnitak

Alnitakで述べたように、スキャナーを使用する場合、EOF文字、基本的には......を簡単に送信することはできず、EOFキーボードを使用する文字。したがって、このような状況では、実行を停止するために送信できる特別な文字またはWordが一般的です。たとえば、

String s1 = sc.next();
if (s1.equals("exit")) {
    break;
}

Breakはループから抜け出します。

4
Renato

あなたの状態は正しいです(ただし、== true)。何が起こっているのかというと、スキャナは入力の最後に到達するまで継続します。試して Ctrl+D、またはファイル(Java myclass < input.txt)。

2
Kevin

フェールセーフをコードにプログラミングしていないため、機能しません。 Javaは、収集する入力がある間もスキャナーが入力を収集できることを確認し、可能であれば、そうし続けます。特定のWordかどうかを確認するスキャナーテストを行って、たとえばEXITのようなものは問題ありませんが、10回などの一定の回数ループさせることもできますが、最も効率的な方法は、プログラムのユーザーに入力する文字列の数を尋ねることです。入力する文字列の数が入力した数より少ない場合、プログラムは実行されます。追加するオプションは、入力するスペースよりも必要なスペースが少なく、次のセルを埋めたくない場合にEXITと入力した場合です。また、コンピュータにさらにデータを入力する必要があることに気付いた場合は、プログラムに入力を増やすかどうかを尋ねさせることができます。プログラムは非常に単純化されます。これらの方法を私に聞いてください、私は部屋が不足しています。 XD

1
Thomas

これにEOF文字を使用したくない場合は、StringTokenizerを使用できます。

import Java.util.*;
public class Test{
   public static void main(){
      Scanner sc = new Scanner (System.in);
      System.out.print("Enter your sentence: ");
      String s=sc.nextLine();
      StringTokenizer st=new StringTokenizer(s," ");//" " is the delimiter here.
      while (st.hasMoreTokens() ) {
        String s1 = st.nextToken();
        System.out.println(s1);
      }

      System.out.println("The loop has been ended");
   }
}
1
Zia Ansari

システム依存のファイルの終わりインジケーター(Unix/Linux/Ubuntuの場合はd、Windowsの場合はz)のいずれかを使用して、whileステートメントを偽にすることができます。これにより、ループから抜け出すことができます。 :)

0
TOLU

同じ問題があり、1つのスキャナーオブジェクトを使用してコンソールから行全体を読み取り、2番目のスキャナーオブジェクトを使用して結果の文字列を解析することで解決しました。

Scanner console = new Scanner(System.in);
System.out.println("Enter input here:");
String inputLine = console.nextLine();

Scanner input = new Scanner(inputLine);
List<String> arg = new ArrayList<>();

while (input.hasNext()) {
    arg.add(input.next().toLowerCase());
}
0
Skandalos