主な違いは何である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
BufferedReader
を使用して行ごとに読んでみませんか?なぜそんなにScanner
流行しているのかわかりません。
next()
スペースまでしか入力を読み取ることができません。スペースで区切られた2つの単語を読み取ることはできません。また、next()
入力を読み取った後、カーソルを同じ行に置きます。
nextLine()
単語間のスペースを含む入力を読み取ります(つまり、行末まで読み取ります) \n
)。入力が読み取られたら、nextLine()
カーソルを次の行に置きます。
行全体を読み取るには、を使用できますnextLine()
。
JavaDocから:
- A
Scanner
は、デフォルトで空白に一致する区切り文字パターンを使用して、入力をトークンに分割します。next()
:このスキャナーから次の完全なトークンを見つけて返します。nextLine()
:このスキャナーを現在の行を超えて進め、スキップされた入力を返します。
したがって、"small example<eol>text"
next()
「小さい」をnextLine()
返し、「小さい例」を返す必要がある場合
next()
含ま\n
れないのはなぜですか?
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終了例与えられた数のためにそれにあなたが提供するそれまではと入力します。
next()
、実際にどのように機能するかがわかりました。Enterキーは無視されますが、nexLine()
完全な入力として受け入れられ、キャプチャされた値をエコーするとコンソールに複製されます。System.out.println(str[i]);
以下に新しい行として追加しました。str[i]=sc.next();
またはstr[i]=sc.nextLine();
重要な点は、メソッドが停止する場所と、メソッドを呼び出した後にカーソルが置かれる場所を見つけることです。
すべてのメソッドは、カーソル位置と次のデフォルトの区切り文字(空白、タブ、\ 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 |
この後、要件に応じてメソッドを呼び出す必要があります。
つまり、長さ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を入力した場合、入力プロンプトは終了し、出力が表示されます)
出力は次のとおりです:-
あいうえお
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です
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()は、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);
}
区切り文字についても問題が発生しました。質問はすべての入力についてでした
問題
ソリューション
スキャナーに区切り文字を使用して、成功しました。
例
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);
}
基本的な違いは、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()を使用して、別の文字列を指定することもできます。この例などを使用してみて、説明を求めることをお勧めします。