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


89

主な違いは何であるnext()とはnextLine()
私の主な目標は、任意のソース(ファイルなど)にScanner「接続」されている可能性のあるを使用して、すべてのテキストを読み取ることです。

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


これはあなたを助けるかもしれません[scanner.nextLine()を使用する] [1]:stackoverflow.com/questions/5032356/using-scanner-nextline
Milaci 2014年

回答:


86

私は常に、を使用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


5
では、aBufferedReaderを使用して行ごとに読んでみませんか?なぜそんなにScanner流行しているのかわかりません。
デビッド・コンラッド

7
@DavidConrad「Scannerクラスのnext()メソッドとnextLine()メソッドの違いは何ですか?」
トリスタン

4
はい、私はそれがOPが求めていたものだと理解しています。あなたがnextLineを使用することを「常に好む」と言っているので、私はただ疑問に思っていました。
デビッド・コンラッド

nextLine()を安全に実行してから、その行専用の新しいスキャナーを作成できます。Scannerクラスは、文字列をスキャンできます:new Scanner(new Scanner(System.in).nextLine())。
axell 1319年

48

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

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

行全体を読み取るには、を使用できますnextLine()


@LuiggiMendoza正式な文章ではなく、フォーマットを意味しますか?
デット

next()は、空白までのみ入力を読み取ることができます空白で区切られた2つの単語を読み取ることはできません。空白スペース、タブや改行が含ま
フレッド胡

19

JavaDocから:

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

したがって、"small example<eol>text" next()「小さい」をnextLine()返し、「小さい例」を返す必要がある場合


1
返されたトークンにがnext()含ま\nれないのはなぜですか?
rimalroshan

2
これはJavaAPI設計者への質問であるか、SOに質問を投稿すると、誰かがその理由を知っているかもしれません。
OlegSklyar19年

10

next()はスペースまでしかスキャンしませんが、nextLine()は行全体をスキャンするので、nextLine()は完全なトークンを取得するまで待機しますが、nextLine()は完全なトークンを待機しません。が取得されます(つまり、Enterキーを押すと)、スキャナーカーソルは次の行に移動し、スキップされた前の行を返します。完全な入力を行ったかどうかはチェックされません。空の文字列を取得しますが、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()メソッドを使用すると、指定された回数のケースを押すと終了することがわかります。次の()doesnot終了例与えられた数のためにそれにあなたが提供するそれまではと入力します。


1
非常に興味深い例です。コードを実行するとnext()、実際にどのように機能するかがわかりました。Enterキーは無視されますが、nexLine()完全な入力として受け入れられ、キャプチャされた値をエコーするとコンソールに複製されます。System.out.println(str[i]);以下に新しい行として追加しました。str[i]=sc.next();またはstr[i]=sc.nextLine();
PabloAdames19年

@PabloAdamesは、必要に応じて回答があれば
賛成

9

重要な点は、メソッドが停止する場所と、メソッドを呼び出した後にカーソルが置かれる場所を見つけることです。

すべてのメソッドは、カーソル位置と次のデフォルトの区切り文字(空白、タブ、\ n--Enterキーを押して作成)の間に空白を含まない情報を読み取ります。カーソルはnextLine()、カーソル位置と\ nの間の情報(区切り文字によって作成された空白を含む)を読み取る、を除いて、区切り文字の前で停止し、カーソルは\ nの後ろで停止します。


たとえば、次の図について考えてみます。

|23_24_25_26_27\n

| ->現在のカーソル位置

_ ->空白

ストリーム->太字(呼び出し元のメソッドによって取得された情報)

これらのメソッドを呼び出すとどうなるかを確認してください。

nextInt()    

23を読む| _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 |


この後、要件に応じてメソッドを呼び出す必要があります。


2
そのような過小評価された答え。他のすべては少し誤解を招くされる
csguy

3

つまり、長さtの文字列配列を入力している場合、Scanner#nextLine()はt行を予期し、文字列配列の各エントリはEnterキーによって他のエントリと区別されます。Scanner#next()は次のように入力を受け取り続けます。 Enterキーを押しますが、空白で区切られた配列内に文字列(単語)を格納します。

次のコードスニペットを見てみましょう

    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の場合)、文字列を次のように入力するかどうかは関係ありません。

次のように入力します:-abcdabcdまたは

として入力:-

あいうえお

あいうえお

出力は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();
    }

次に、プロンプトに入力を--abcdabcdと入力すると

出力は:-

abcd abcd

プロンプトの入力をabcdとして入力した場合(Enterキーを押して別の行に次のabcdを入力した場合、入力プロンプトは終了し、出力が表示されます)

出力は次のとおりです:-

あいうえお


2

以下からのjavadoc

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

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


1

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

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

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

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


1

next()メソッドとnextLine()メソッドはスキャナーに関連付けられており、文字列入力を取得するために使用されます。それらの違いは...

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の文字列を入力abcdef
c is abc

dの文字列を入力します

dはdefです

next()の代わりにnextLine()を使用する場合

出力:

cの文字列を入力してください

ABC DEFc

dのABCDEF入力文字列です

GHId
はGHIです


1
  • 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

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

Next()は、1つの単語を読み取るために使用し、空白が入ると読み取りを停止し、カーソルを元の位置に戻します。 NextLine()は、空白に出会っても単語全体を読み取ります。読み取りが終了するとカーソルが停止し、カーソルが行の終わりに戻ります。したがって、単語全体を文として読みたい場合は、区切り文字を使用する必要はありません。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

両方の関数は、次のスキャナートークンに移動するために使用されます。

違いは、スキャナートークンの生成方法にあります

next()は、区切り文字を空白として使用してスキャナートークンを生成します

nextLine()は、区切り文字を「\ n」として使用してスキャナートークンを生成します(つまり、Enterキーを押します)


0

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

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

問題

  1. 名前、年齢、メールアドレスで問題なく終了しました。
  2. 空白のある2つの単語のアドレス(ハーネットストリート)を思いついたとき、最初の1つの「ハーネット」を取得しました。

ソリューション

スキャナーに区切り文字を使用して、成功しました。

 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

基本的な違いは、next()は、区切り文字が見つかるまで入力を取得するために使用され(デフォルトでは空白ですが、変更することもできます)、入力したトークンを返します。カーソルは同じ行に留まります。一方、nextLine()では、Enterボタンを押してすべてを返すまで入力をスキャンし、カーソルを次の行に置きます。****

        Scanner sc=new Scanner(System.in);
        String s[]=new String[2];
        for(int i=0;i<2;i++){
            s[i]=sc.next();
        }
        for(int j=0;j<2;j++)
        {
            System.out.println("The string at position "+j+ " is "+s[j]);
        }

****

Inputを「HelloWorld」として指定してこのコードを実行してみてください。スキャナーは「o」まで入力を読み取り、区切り文字が発生します。したがって、s [0]は「Hello」になり、カーソルはdelimiter(の次の位置を指します。これは「W」です)、s [1]が読み取られると、「World」がスキャンされ、次の完全なトークンとしてs [1]に返されます(Scannerの定義による)。nextLine()を使用する場合代わりに、Enterボタンを押してs [0]に保存するまで、「HelloWorld」を完全に読み取ります。nextLine()を使用して、別の文字列を指定することもできます。この例などを使用してみて、説明を求めることをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.