web-dev-qa-db-ja.com

Scannerクラスのnext()メソッドとnextLine()メソッドの違いは何ですか?

next()nextLine()の主な違いは何ですか?
私の主な目的は、すべてのテキストをScannerを使って読むことです。これはあらゆるソースに「つながっている」(例えばファイル)。

どちらを選ぶべきなのか、そしてその理由は?

67
AnnieOK

私はいつもnextLine()を使って入力を読み、それから文字列を解析することを好みます。

next()を使うことはスペースの前に来るものだけを返すでしょう。 nextLine()は、現在の行を返した後にスキャナを自動的に下に移動します。

nextLine()からデータを解析するための便利なツールはstr.split("\\s+")です。

String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces

ScannerクラスまたはStringクラスの詳細については、以下のリンクを参照してください。

スキャナー: http://docs.Oracle.com/javase/7/docs/api/Java/util/Scanner.html

文字列: http://docs.Oracle.com/javase/7/docs/api/Java/lang/String.html

65
Tristan

next()はスペースまで入力を読み込むことができます。スペースで区切られた2つの単語を読むことはできません。また、next()は入力を読んだ後にカーソルを同じ行に置きます。

nextLine()は、単語間のスペースを含む入力を読み取ります(つまり、\n行の終わりまで読み取ります)。入力が読み込まれると、nextLine()はカーソルを次の行に移動します。

行全体を読むためにはnextLine()を使うことができます。

35
RKC

JavaDocから:

  • Scannerは、区切り文字パターンを使用して入力をトークンに分割します。デフォルトでは、空白文字と一致します。
  • next():このスキャナーから次の完全なトークンを見つけて返します。
  • nextLine():このスキャナを現在の行を越えて進め、スキップされた入力を返します。

"small example<eol>text"の場合、next()は "small"を返し、nextLine()は "small example"を返すべきです。

15
Oleg Sklyar

私がnext()とは別に注目したのは、nextLine()が行全体をスキャンするスペースだけをスキャンすることです次は完全なトークンを取得するまで待機します where as nextLine()は実行しません) '\ n'が得られたとき(すなわちエンターキーを押したとき)、完全なトークンを待ちます。スキャナのカーソルは次の行に移動し、前の行をスキップして返します。完了したかどうかはチェックしません。入力してもしなくても、next()が空文字列を受け取らない場合でも、空文字列を取ります。

public class ScannerTest {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        String []str = new String[cases];
        for(int i=0;i<cases;i++){
            str[i]=sc.next();
        }
     }

}

Forループでnext()とnextLine()を変更してこのプログラムを試してください。何も入力せずにenterキーである '\ n'を押し続けると、nextLine()メソッドで終了を使用して見つけることができます。 as next()が終了しないが与えられたケースの数だけそれを入力し、入力されるまで、ケースの与えられた数を押した後。

7
murali krish

この質問で重要な点は、メソッドを呼び出した後にメソッドが停止する場所とカーソルがどこにあるかを見つけることです。すべてのメソッドは、カーソル位置と次のデフォルトの区切り文字(空白、タブ、\ n - Enterキーを押して作成)の間の情報を読み取り(空白を含まない)、カーソルを区切り文字の前で停止します。カーソル位置と\ nの間の情報(区切り文字で作成された空白を含む)を読み取り、カーソルは\ nの後ろで停止します。

例えば、(|は現在のカーソル位置を表し、_は空白を表し、streamを呼び出しメソッドで取得した情報を太字で)

23_24_25_26_27\n

NextInt()を呼び出します。読む2 | _24_25_26_27\n

NextDouble()を呼び出します。 23 _24 | _25_26_27を読みます\ n

Next()を呼び出します。 23_24 _25 | _26_27を読みます\ n

NextLine()を呼び出します。 23_24_25をお読みください_ 26_27\n |

この後、メソッドはあなたの要求に応じて呼ばれるべきです。

4
Z. Zhang

つまり、長さtの文字列配列を入力する場合、Scanner#nextLine()はt行を期待し、文字列配列内の各エントリはenterキーで他のエントリと区別されます。 Enterキーを押しますが、空白で区切られた配列内に文字列(Word)が格納されます。

次のコードの断片を見てみましょう。

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.next();
    }

IDEのコードスニペットの上を実行するとき(文字列の長さが2の場合を例にします)、文字列を次のように入力しても関係ありません。

以下のように入力してください。 - abcd abcdまたは

として入力: -

あいうえお

あいうえお

出力はabcdのようになります

あいうえお

しかし同じコードでnext()メソッドをnextLine()に置き換えれば

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.nextLine();
    }

プロンプトで入力を - abcd abcdと入力した場合

出力は以下のとおりです。 -

abcd abcd

そして、あなたがabcdとしてプロンプトに入力を入力するならば(そしてあなたが別の行で次のabcdを入力するためにエンターを押すならば、入力プロンプトはちょうど終了し、あなたは出力を得るでしょう)

出力は以下のとおりです。 -

あいうえお

2
himani1349

から javadocs

next()指定された文字列から構築されたパターンと一致する場合は、次のトークンを返します。 nextLine()現在の行を越えてこのスキャナを進め、スキップされた入力を返します。

どちらを選択するかは、どちらがニーズに最も適しているかによって異なります。ファイル全体を読んでいるのであれば、ファイルがすべて揃うまでnextLineに進みます。

2
onesixtyfourth

スキャナは区切り文字パターンを使用して入力をトークンに分割します。これはデフォルトでは空白と呼ばれます。

Next()は一つのWordを読むのに使います、そしてそれが空白を得るとき、それは読みを停止し、カーソルをその元の位置に戻します。 NextLine()これは空白に出会ってもWord全体を読みます。読み終わった時点でカーソルは停止し、カーソルは行末まで戻ります。したがって、完全なWordを文として読みたい場合は、区切り文字を使用する必要はありません。NextLine()を使用するだけで済みます。

 public static void main(String[] args) {
            // TODO code application logic here
           String str;
            Scanner input = new Scanner( System.in );
            str=input.nextLine();
            System.out.println(str);
       }
1
Negash

スキャナ のドキュメントから:

Scannerは、デフォルトで空白と一致する区切り文字パターンを使用して入力をトークンに分割します。

next() のドキュメントから:

完全なトークンの前後には、区切り文字パターンと一致する入力があります。

1
Foobar
  • Scanner.next()とnextLine()の別の例としては、次のようなものがあります。nextLine()はユーザーが入力を許可しないのに対し、next()はScannerを待機させて入力を読み取ります。

     Scanner sc = new Scanner(System.in);
    
     do {
        System.out.println("The values on dice are :");
        for(int i = 0; i < n; i++) {
            System.out.println(ran.nextInt(6) + 1);
        }
        System.out.println("Continue : yes or no");
     } while(sc.next().equals("yes"));
    // while(sc.nextLine().equals("yes"));
    
1
annoo9605

next()およびnextLine()メソッドはScannerに関連付けられており、String入力を取得するために使用されます。それらの違いは...

next()はスペースまで入力を読み込むことができます。スペースで区切られた2つの単語を読むことはできません。また、next()は入力を読み込んだ後にカーソルを同じ行に置きます。

nextLine()は、単語間のスペースを含む入力を読み取ります(つまり、行末まで読み取ります\ n)。入力が読み込まれると、nextLine()はカーソルを次の行に配置します。

import Java.util.Scanner;

public class temp
{
    public static void main(String arg[])
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("enter string for c");
        String c=sc.next();
        System.out.println("c is "+c);
        System.out.println("enter string for d");
        String d=sc.next();
        System.out.println("d is "+d);
    }
}

出力:

c abc defに文字列を入力してください
cはabcです

dに文字列を入力

dはdefです

もしnext()の代わりにnextLine()を使うなら

出力:

cに文字列を入力

ABC DEF
cはABC DEFです
dに文字列を入力してください

GHI
dはGHIです

1
Musaddique

区切り文字についても問題がありました。質問はすべての入力についてでした

  1. あなたの名前を入力してください。
  2. あなたの年齢を入力。
  3. メールアドレスを入力。
  4. あなたの住所を入力してください。

問題

  1. 私は名前、年齢、そしてEメールでうまくいった。
  2. 空白(Harnet street)という2つの単語のアドレスを思いついたとき、私は最初の1つの "harnet"を得ました。

解決策

私は自分のスキャナーに区切り文字を使用し、うまくいった。

 public static void main (String args[]){
     //Initialize the Scanner this way so that it delimits input using a new line character.
    Scanner s = new Scanner(System.in).useDelimiter("\n");
    System.out.println("Enter Your Name: ");
    String name = s.next();
    System.out.println("Enter Your Age: ");
    int age = s.nextInt();
    System.out.println("Enter Your E-mail: ");
    String email = s.next();
    System.out.println("Enter Your Address: ");
    String address = s.next();

    System.out.println("Name: "+name);
    System.out.println("Age: "+age);
    System.out.println("E-mail: "+email);
    System.out.println("Address: "+address);
}
0
Negash