回答編集履歴
1
修正
test
CHANGED
@@ -20,14 +20,76 @@
|
|
20
20
|
|
21
21
|
`sc.hasNextLine()`
|
22
22
|
|
23
|
-
とあります。
|
23
|
+
とあります。そこからさらに `sc`が何者なのかを辿ると、
|
24
24
|
|
25
|
+
`Scanner sc = new Scanner(System.in);`
|
26
|
+
|
25
|
-
|
27
|
+
とあるので、`sc`は`Scanner`クラスと分かります。
|
26
28
|
|
27
29
|
|
28
30
|
|
31
|
+
その次には、`Scanner`クラスの[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html)を確認します。
|
32
|
+
|
29
|
-
(
|
33
|
+
`hasNextLine()`メソッドの欄を見ると、こうあります。
|
30
34
|
|
31
35
|
|
32
36
|
|
37
|
+
> public boolean hasNextLine()
|
38
|
+
|
39
|
+
このスキャナの入力に別の行がある場合はtrueを返します。
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
戻り値はbooleanで、内容は次の行があるかどうか、です。
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
ここまで行くと、`sc.hasNextLine()`の意味が解りますが、
|
48
|
+
|
49
|
+
`sc`の対象は`System.in`標準入力なのですこし厄介です。
|
50
|
+
|
51
|
+
標準入力はユーザーが入力し続ける限り、次の行が存在する一種の無限のストリームになっていますので、
|
52
|
+
|
53
|
+
次の行はずっとあり続けます(常に`true`)。
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
これを終了させるには、Windowsであれば`CTRL-Z`、UNIXやLinuxであれば`CTRL-D`を入力することで、
|
58
|
+
|
59
|
+
終了とみなされ、結果が`false`になります。
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
`sc.hasNextLine()` =「入力が続いているか」みたいな感じになります。
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
次はこの部分です。
|
68
|
+
|
69
|
+
`!sc.hasNextLine()`
|
70
|
+
|
71
|
+
これはシンプルに、`!`+`sc.hasNextLine()` です。
|
72
|
+
|
73
|
+
`!`は、論理演算を行う単項演算子で、真は偽に、偽は真にと、真偽値を反転します。
|
74
|
+
|
75
|
+
意味に置き換えれば、上のものを反転するので、
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
`!sc.hasNextLine()` =「入力が**終了した**か」になります。
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
`if (!sc.hasNextLine()) break;`
|
84
|
+
|
85
|
+
あとは、普通にif文ですので、
|
86
|
+
|
87
|
+
「入力が**終了した**なら、break」
|
88
|
+
|
89
|
+
となります。
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
これにより、すぐ外側の、`while(true)`の無限ループを抜けます。
|
94
|
+
|
33
|
-
ま
|
95
|
+
そこまで含めるなら、「入力が終了するまで繰り返せ」になります。
|