equalsメソッドの否定について


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でエラーが出ます。

回答の条件
  • 1人20回まで
  • 登録:2018/12/22 21:52:28
  • 終了:2018/12/29 08:02:04
id:moon-fondu

「種別がありません。再度入力してください。」というメッセージも、hensuunitsuiteで入力した値が正しかった場合は、i<=9までの文字列のみ出してほしいのですが。
また、なぜかi=9のanimalとtousuuの出力の後に、必ずくっ付いて出てくるのです…出ないようにしたいです。

この状態を改善して、正しい結果を出す方法はないでしょうか。
ご教授いただけますと幸いです。よろしくお願い致します。

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4770ベストアンサー獲得回数20492018/12/23 00:15:44

ポイント750pt

質問の文面では、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("種別がありません。再度入力してください。");
}
他11件のコメントを見る
id:a-kuma3

あ、しまった (´・ω・`)
おっしゃるとおり、Scanner からの取得がないとダメですね。

2018/12/24 23:56:32
id:moon-fondu

遅くなりましてすみません(;'∀')
a-kuma3さん、bnnさん、ありがとうございます。
「hensuunitsusite = scan.nextLine(); //←これ」の一文で無限ループ止まるんですね~そんな機能?があるんですね、この一文に。

bnnさんが書いてくださったプログラムもいい感じに動きました!
ありがとうございました。

2018/12/29 08:01:04
id:bnn No.2

bnn回答回数110ベストアンサー獲得回数372018/12/23 15:20:18

ポイント750pt

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ループに続く、という感じですかね。

他1件のコメントを見る
id:bnn

ここまで書けるのであれば分析とか知識というより、本当にたどっていくだけなんです。

iが0から始まって、if~elseを通って何が出力されるか。
iが1になったら、2なら、3ならと順に紙に書いていくだけです。

急いでforループを形だけで覚えようとすると、掛け算の意味を知らないまま九九を覚えるようなもので、後々あまり役に立たないです。最初の方はループ毎にどう処理されているのかを実際にたどってみるというのは必要な事だと思います。

2018/12/23 22:01:25
id:moon-fondu

はい、ありがとうございます。
bnnさんと似たような指導を、ばりばりjava書いてる人から言われたことがあります。
「中身の処理を1つずつ書くのが大事」と。for文だから、ではなく、中身の処理をしっかりと分析したいと思います。

2018/12/24 10:14:50
  • id:moon-fondu
    似たような質問もあったのですが。

    http://webcache.googleusercontent.com/search?q=cache:vomXv_4hpIQJ:www.atmarkit.co.jp/bbs/phpBB/viewtopic.php%3Ftopic%3D595%26forum%3D12+&cd=4&hl=ja&ct=clnk&gl=jp

    「!」などを入れて書き換えてみても、エラーは消えなかったので…。
  • id:moon-fondu
    皆さんありがとうございます、家に帰ってからまた確認します!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません