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

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

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

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

Q&A

解決済

3回答

601閲覧

[Java] Scannerから取得した値がおかしい

nechikoyan

総合スコア12

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

0グッド

0クリップ

投稿2020/09/25 09:44

編集2020/09/26 10:05

Paizaラーニングのレベルアップ問題集AランクレベルアップメニューJava編・「座標系での向きの変わる移動」という問題に取り組んでいるのですが、Scannerで取得した文字列の値がおかしいです。
4枚目の画像の

-18 45 6
L
L
R
R
L
R

という入力を下記のコードで読み込んだとき、本来6番目に”R”と取得されるべきところが”L”で取得されているようです。
最後の文字だけ改行がないのが原因と思い、ループ内に分岐を作ってみたり、nextLine()をnext()にしてみたり色々と試してみたのですが、原因がわかりません。
ご教授いただけると幸いです。

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

↓Eclipseで動かしているコード↓

Java

1package practice0920; 2import java.util.Scanner; 3 4public class PracticeFinal { 5 public static void main(String[] args) { 6 7 Scanner sc = new Scanner(System.in); 8 int x = sc.nextInt(); //最初の位置のx座標 9 int y = sc.nextInt(); //最初の位置のy座標 10 int n = sc.nextInt(); //移動の回数 11 sc.nextLine(); //行送り 12 13 int newX = x; //移動後のx座標 14 int newY = y; //移動後のy座標 15 16 String hougaku = "N"; //方角(初期値は北) 17 String muki = ""; //向いている向き 18 19 for(int i = 0; i < n; i++){ 20 21 if(i < n - 1) { 22 muki = sc.nextLine(); 23 }else if(i == i - 1) { 24// sc.nextLine(); 25 muki = sc.next(); 26 } 27 28 System.out.println(muki + " " + hougaku); //デバッグ用 29 30 31 if(hougaku.equals("N")){ //hougakuが"N"のとき 32 if(muki.equals("R")){ //mukiが"R"なら、 33 newX++; //newXの座標を右に1進める 34 hougaku = "E"; //hougakuを"E"(東)にする 35 }else if(muki.equals("L")){ 36 newX--; 37 hougaku = "W"; 38 } 39 40 }else if(hougaku.equals("S")){ 41 if(muki.equals("R")){ 42 newX--; 43 hougaku = "W"; 44 }else if(muki.equals("L")){ 45 newX++; 46 hougaku = "E"; 47 } 48 49 }else if(hougaku.equals("E")){ 50 if(muki.equals("R")){ 51 newY++; 52 hougaku = "S"; 53 }else if(muki.equals("L")){ 54 newY--; 55 hougaku = "N"; 56 } 57 58 }else if(hougaku.equals("W")){ 59 if(muki.equals("R")){ 60 newY--; 61 hougaku = "N"; 62 }else if(muki.equals("L")){ 63 newY++; 64 hougaku = "S"; 65 } 66 67 } 68 69 System.out.println(newX + " " + newY); //移動先のx座標とy座標を出力する 70 71 } 72 73 } 74}

★9月26日追記★

Java

1 }else if(i == n - 1) { //一番最後の値を取得するとき 2 3 if(sc.hasNext()) { 4 muki = sc.next(); 5 } 6 7 }

というようにhasNext()で次の入力があるかどうか調べるif文を追加したところ、何故か正しい値を取得出来るようになり、paizaのチェックを通過しました。
eclipseのコンソール上での挙動が安定していないため(4行目と5行目の間に空白行が挿入される、Enterキーを押さないと最後の値を取得しない)、他に良い書き方があればご教授お願いします。

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

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

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

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

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

m.ts10806

2020/09/25 09:58 編集

コードは画像では誰も再現確認できませんので、テキストでマークダウンのcode機能にてご提示ください。 →失礼、最初に提示されてましたね。 提示されたコードと画像のコードは同じということで良いですね?
nechikoyan

2020/09/25 10:19

最後の画像のコードと同じものです
guest

回答3

0

自己解決

Java

1 }else if(i == n - 1) { 2 3 if(sc.hasNext()) { 4 muki = sc.next(); 5 } 6 7 }

投稿2020/09/28 04:31

nechikoyan

総合スコア12

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

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

0

なにがやりたいのか、よくわかってないですが・・・

java

1 if(i < n - 1) { 2 muki = sc.nextLine(); 3 }else if(i == i - 1) { 4// sc.nextLine(); 5 muki = sc.next(); 6 }

i==i-1になることは絶対にないので、いわゆるデッドコード。
その部分は通らないので、そこを修正する意味はないです。

if(i < n - 1)のif文があるため、 最後の1行は読み込まれません。

wyq2020さんへ自身でコメントしている通り。

nechikoyan write at 2020/09/25 21:24
しかしこのコードですと5つ目の文字までしか受け取れません

RをLとして読み込んでいるのでなく、最後のRを読んでいないのでmukiが更新されないまま直前のLを使っています。

単純にif文をとっぱらって

java

1// if(i < n - 1) { 2 muki = sc.nextLine(); 3// }else if(i == i - 1) { 4// sc.nextLine(); 5// muki = sc.next(); 6// }

じゃダメなの?

投稿2020/09/25 16:11

momon-ga

総合スコア4820

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

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

nechikoyan

2020/09/26 09:46

else if(i == n - 1)とするところを(i == i - 1)にしていたようです。 sc.nextLine()は改行を区切り文字として文字列を取得するメソッドらしく、改行のない最後の"R"をsc.nextLine()で取得することは出来なさそうです。 (i == n - 1)では5番目の入力までしか取得出来ませんでしたが、 }else if(i == n - 1) { //一番最後の値を取得するとき if(sc.hasNext()) { muki = sc.next(); } } というようにhasNext()で次の入力があるかどうか調べるif文を追加したところ、何故か正しい値を取得出来るようになりました。 eclipseのコンソール上での挙動が安定していないのですが、修正したコードでpaizaのチェックを通過したこともあり、今回は深追いしないことにします。
guest

0

if(i < n - 1) { muki = sc.nextLine(); }else if(i == n - 1) { // i -> n muki = sc.next(); }

投稿2020/09/25 10:09

wyq2020

総合スコア54

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

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

nechikoyan

2020/09/25 12:24

回答ありがとうございます しかしこのコードですと5つ目の文字までしか受け取れません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問