javaの勉強をしている者です。
今、こんな感じのfor文があります。
------------------
・・・
for (int i = 0; i < 10; i++) {
if (hensuunitsuite.equals(syubetsu[i])) {
System.out.println(animal[i]);
System.out.println(tousuu[i]);
}
else (hensuunitsuite.notequals(syubetu[i])){
System.out.println("種別がありません。再度入力してください。");
}
}
・・・
------------------
これは、エラー文になります。
hensuunitsuiteという変数については。前のコードで、
「import java.util.Scanner;」で、スキャナークラスを呼び出して。
「Scanner scan = new Scanner(System.in);」というのも記述して。
「String hensuunitsuite = scan.nextLine();」で、値が入力できるようにしております。
hensuunitsuiteで入力した文字列が、変数syubetsuで定義しておいた値と一致すれば。
カウンタ変数iに応じた動物名(animal)と、その頭数(tousuu)が出てくるというプログラムです。
そしてelseの場合、例えばhensuunitsuiteで入力した文字列が、変数syubetsuで定義した値と一致しない場合。
その時は再入力を促したいのですが…どうにも、notequalsメソッドなんて無いのでしょうか、Eclipseでエラーが出ます。
「種別がありません。再度入力してください。」というメッセージも、hensuunitsuiteで入力した値が正しかった場合は、i<=9までの文字列のみ出してほしいのですが。
また、なぜかi=9のanimalとtousuuの出力の後に、必ずくっ付いて出てくるのです…出ないようにしたいです。
この状態を改善して、正しい結果を出す方法はないでしょうか。
ご教授いただけますと幸いです。よろしくお願い致します。
質問の文面では、syubetu の型が分からないのですが、
else (hensuunitsuite.notequals(syubetu[i])){
↑は、↓です。
else (! hensuunitsuite.equals(syubetu[i])){
ただ、if の方が
if (hensuunitsuite.equals(syubetsu[i])) {
となっているので、以下のようにするだけで、やりたいことは達成できると思います。
if (hensuunitsuite.equals(syubetsu[i])) { System.out.println(animal[i]); System.out.println(tousuu[i]); } else { System.out.println("種別がありません。再度入力してください。"); }
notequals()については#1の方のおっしゃる通りです。
"動物"と入れると、正しい結果が出たかと思ったのですが…最後の一文「種別がありません。再度入力してください。」という、余計な文字列が出てきます。これを消したいです。
forループを順に辿っていけばわかるのですが、
hensuunitsusite = "動物"
i=0のとき
syubetsu[0] = "動物" = hensuunitsusite
出力:
キリン
7頭
i=1、i=2の時
省略
ここまでの出力:
キリン
7頭
ライオン
3頭
ゴリラ
5頭
i=3のとき
syubetsu[3] = "植物" ≠ hensuunitsusite
if(hensuunitsusite.equals(syubetsu[i])) の条件を満たさないのでelseの処理が入り
"種別がありません。再度入力してください。"と最後に出力される。
hensuunitsusite = "植物" の時は逆になっていて
i=0~2のとき、毎回elseの処理が入っているため、
"種別がありません。再度入力してください。"が3つ表示されてから
i=3のひまわりに続いています。
つまりはforループ内のelse文が原因なので、これを丸ごと消してしまうだけでとりあえず解決します。
後は、消したelse文で行おうとしていた入力のチェックを今のforループの前に持ってきます。流れとしては、先にhensuunitsusiteで入力した文字列がsyubetsu[]に存在しているかチェック。
していなければ "種別がありません。再度入力してください。"
していれば、elseを削除したforループに続く、という感じですかね。
ここまで書けるのであれば分析とか知識というより、本当にたどっていくだけなんです。
iが0から始まって、if~elseを通って何が出力されるか。
iが1になったら、2なら、3ならと順に紙に書いていくだけです。
急いでforループを形だけで覚えようとすると、掛け算の意味を知らないまま九九を覚えるようなもので、後々あまり役に立たないです。最初の方はループ毎にどう処理されているのかを実際にたどってみるというのは必要な事だと思います。
はい、ありがとうございます。
bnnさんと似たような指導を、ばりばりjava書いてる人から言われたことがあります。
「中身の処理を1つずつ書くのが大事」と。for文だから、ではなく、中身の処理をしっかりと分析したいと思います。
あ、しまった (´・ω・`)
2018/12/24 23:56:32おっしゃるとおり、Scanner からの取得がないとダメですね。
遅くなりましてすみません(;'∀')
2018/12/29 08:01:04a-kuma3さん、bnnさん、ありがとうございます。
「hensuunitsusite = scan.nextLine(); //←これ」の一文で無限ループ止まるんですね~そんな機能?があるんですね、この一文に。
bnnさんが書いてくださったプログラムもいい感じに動きました!
ありがとうございました。