質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

5540閲覧

Scanner.nextLine();の使い方

shichihukujin

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/10/02 09:45

import java.util.Scanner; import java.lang.System; public class sample{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); String text=sc.nextLine(); } }

上のコードについて質問があります。
このコードは実行すると、キーボードからの入力が受け付けられます。
しかし、もしString text=sc.nextLine();の行がないと、受け付けられません。
なので、このままだと、最後の行のおかげでのみ
キーボードからの入力が受け付けられる、と理解してしまいそうです。

しかし、nextLineという文字列から、Iterator的な意味合いを感じますが、
僕の知っているそれは、事前にコレクションに格納されているインスタンスを指すものです。
よって、sc.nextLine();で入力を受け付けなくても、
その前段階でキーボード入力を受け付けて複数の文字列を格納しておいて、
それらを、順にsc.nextLine();で取得していく、
というような、nextLine();の使い方もあるのではないか?と考えてしまいました。
もし、その使い方ができるならば、具体的なコードで教えて頂きたいです。
どうか、お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

nextLineという文字列から、Iterator的な意味合いを感じますが、

確かにScannerはIteratorを実装していますが、そもそもIteratorを誤解しているようです。
Iteratorは「反復子」と訳され、「要素を繰り返し取り出す」という意味に過ぎません。たまたまその対象がListなどのコレクションだったのが多く、要素を予めもっていたからその中から繰り返し取り出していただけです。
Scannerの場合はnextなどのときに読み込んでいるカーソルを進めて、その間に通過した文字を出すことにより、「繰り返し文字列を取り出す」という機能を実現しています。Scannerは文字列を格納するという機能はもっていません。

で、今回のScannerは標準入力を入力の対象にしていますが、このときにどのように要素を取得するかはこの標準入力の仕様によると思われます。Eclipseなどの実行環境においてはnextLine()の段階で要素がないときに入力を待ちます。逆に入力されなければ進む術がない場合もあります。
ideoneのようなオンラインの実行環境の場合は「実行中にキーボードから入力を受け付ける」ということができないので、実行前に標準入力の場所にまとまった文字列を入れておいて実行し、お望みの通り順番に取り出していくというような処理になります。
またScannerはFile型もコンストラクタの引数に取れるので、ファイルから読み込むことも可能です。この場合もまとまった文字列から順次取得し処理する形になるでしょう。

投稿2016/10/02 10:55

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shichihukujin

2016/10/02 11:37

回答ありがとうございます。 nextLine()の段階で要素がないときに入力を待ちます とありますが、nextLine()の段階で要素がある場合はあるのですか? ある場合、その状況はどのように 実現されているのでしょうか? こちらのニュアンスの質問が僕が意図していたことに近いと感じます。 たびたび失礼しました。
swordone

2016/10/02 11:47

あるときはそこから文字を取得して返すだけです。 文字列をコピペで標準入力に複数行入れた場合、そうなりえますが、 あくまでこの文字列は標準入力に入っているだけで、Scannerには入っていません。
shichihukujin

2016/10/02 12:11

度々、ありがとうございます。APIにも同じようなことが書いてありましたが、APIを完全に理解できる段階に達していないために、気になって質問してしまいました。 Iteratorの説明まで助かりました。
guest

0

lang

1public class ScannerSample { 2 3public static void main(String[] args) { 4 5 Scanner sc = new Scanner(System.in); 6 List<String> inputArray = new ArrayList<String>(); 7 try { 8 while (sc.hasNextLine()) { 9 String line = sc.nextLine(); 10 inputArray.add(line.toUpperCase()); 11 } 12 } finally { 13 for (String line : inputArray) { 14 System.out.println(line); 15 } 16 sc.close(); 17 } 18}

投稿2016/10/02 10:07

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unz.hori

2016/10/02 10:10

入力された文字列を大文字変換し、入力終了時に標準出力に全ての行を出力しています。
unz.hori

2016/10/02 10:14

Scannerをイテレータとして参照したい場合は、以下のページが参考になると思います。 argius note プログラミング関連 Javaで1行ずつテキストデータを読み込むイディオムの変遷 http://argius.hatenablog.jp/entry/2015/06/06/234315
shichihukujin

2016/10/02 12:14

頂いたURLに行きました。こちらも今回の質問に答えてくれていましたが、必要十分な答えのページではありませんでした。しかし、必要な情報ではあったので感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問