next()
とnextLine()
の主な違いは何ですか?
私の主な目的は、すべてのテキストをScanner
を使って読むことです。これはあらゆるソースに「つながっている」(例えばファイル)。
どちらを選ぶべきなのか、そしてその理由は?
私はいつも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
next()
はスペースまで入力を読み込むことができます。スペースで区切られた2つの単語を読むことはできません。また、next()
は入力を読んだ後にカーソルを同じ行に置きます。
nextLine()
は、単語間のスペースを含む入力を読み取ります(つまり、\n
行の終わりまで読み取ります)。入力が読み込まれると、nextLine()
はカーソルを次の行に移動します。
行全体を読むためにはnextLine()
を使うことができます。
JavaDocから:
Scanner
は、区切り文字パターンを使用して入力をトークンに分割します。デフォルトでは、空白文字と一致します。next()
:このスキャナーから次の完全なトークンを見つけて返します。nextLine()
:このスキャナを現在の行を越えて進め、スキップされた入力を返します。
"small example<eol>text"
の場合、next()
は "small"を返し、nextLine()
は "small example"を返すべきです。
私が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()が終了しないが与えられたケースの数だけそれを入力し、入力されるまで、ケースの与えられた数を押した後。
この質問で重要な点は、メソッドを呼び出した後にメソッドが停止する場所とカーソルがどこにあるかを見つけることです。すべてのメソッドは、カーソル位置と次のデフォルトの区切り文字(空白、タブ、\ 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 |
この後、メソッドはあなたの要求に応じて呼ばれるべきです。
つまり、長さ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を入力するためにエンターを押すならば、入力プロンプトはちょうど終了し、あなたは出力を得るでしょう)
出力は以下のとおりです。 -
あいうえお
から javadocs
next()指定された文字列から構築されたパターンと一致する場合は、次のトークンを返します。 nextLine()現在の行を越えてこのスキャナを進め、スキップされた入力を返します。
どちらを選択するかは、どちらがニーズに最も適しているかによって異なります。ファイル全体を読んでいるのであれば、ファイルがすべて揃うまでnextLineに進みます。
スキャナは区切り文字パターンを使用して入力をトークンに分割します。これはデフォルトでは空白と呼ばれます。
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);
}
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"));
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です
区切り文字についても問題がありました。質問はすべての入力についてでした
問題
解決策
私は自分のスキャナーに区切り文字を使用し、うまくいった。
例
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);
}