人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: moon-fondu
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

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

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


1 ● a-kuma3
●750ポイント

質問の文面では、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("種別がありません。再度入力してください。");
}

moon-fonduさんのコメント
a-kuma3さんご回答ありがとうございます。 質問が判りにくく、すみません。 現状、コードは以下になりまして、2つのclassファイルで構成されています。 https://gist.github.com/AuroraNorthernQuarter/d281a27717ab7844a7b77b91bcbb69e7 https://gist.github.com/AuroraNorthernQuarter/1d97d3bb5e5ad9061105b2b8fa49180f testprogrammを実行すると、種別を入力できます。 "動物"と入れると、正しい結果が出たかと思ったのですが…最後の一文「種別がありません。再度入力してください。」という、余計な文字列が出てきます。これを消したいです。 "植物"と入れると、3つも「種別がありません。再度入力してください。」という余計な文字列が出てきてます。正しい、 ひまわり 1本 だけ表示させたいのです…。 また、"動物"とも"植物"とも入力しない場合、「種別がありません。再度入力してください。」という文字列が4つも出てくるのです。これも、1つだけにしたいのですが。 度々すみません。どうコードを直せば悩んでおりまして。 修正箇所・内容等、お手隙の時に再度、お教えいただけますと幸いです。 よろしくお願い致します<m(__)m>

a-kuma3さんのコメント
質問の要旨を理解しました。 以下の for 文を、 >|java| for (int i = 0; i < 4; i++) { if (hensuunitsusite.equals(syubetsu[i])) { System.out.println(animal[i]); System.out.println(tousuu[i]); } else { System.out.println("種別がありません。再度入力してください。"); } } ||< 次のように修正してください。 >|java| boolean found = false; for (int i = 0; i < 4; i++) { if (hensuunitsusite.equals(syubetsu[i])) { System.out.println(animal[i]); System.out.println(tousuu[i]); found = true; } } if (! found) { System.out.println("種別がありません。再度入力してください。"); } ||<

moon-fonduさんのコメント
boolean句って末尾に持ってきても適用されるんですね、知りませんでした! ありがとうございます。 すみません、最後に1つ、もしよければお答えいただきたいのですが。 "動物"でも"植物"でも文字列を入力した場合、 ------------------------ 種別がありません。再度入力してください。 ------------------------ と、出てくるのですが。 表示を出すと同時に、 ------------------------ 種別がありません。再度入力してください。 再入力: ------------------------ のように、また文字を入力できる仕様にすることは、できないでしょうか。 度々恐縮です、もし気が向きましたら、よろしくお願いします(^^;

a-kuma3さんのコメント
>> のように、また文字を入力できる仕様にすることは、できないでしょうか。 << 気が向きました <tt>:-)</tt> livingthing() メソッドの末尾を、以下のようにしてください。 >|java| boolean found = false; for (int i = 0; i < 4; i++) { if (hensuunitsusite.equals(syubetsu[i])) { System.out.println(animal[i]); System.out.println(tousuu[i]); found = true; } } scan.close(); // ここで、Scanner の close をしておく if (! found) { System.out.println("種別がありません。再度入力してください。"); livingthing(); } ||<

bnnさんのコメント
横から失礼します。 これですと、入力が 「動物」の場合、found = falseでループが終了し 「植物」の場合、found = trueでループが終了と、異なる結果になってしまいませんでしょうか。 少しごっちゃになってしまっているのが、「種別がありません。再度入力してください。」の文言を - 入力した文字列が「動物」「植物」のどちらでもない場合だけ表示したいのか - 「動物」「植物」の何れかが入力され出力があった場合でも表示したいのか で少し事情が変わってくるからなのですが、文言からすると前者だと思ったので、出力する前に出力する必要があるのかのチェックが必要。(先ほどの回答の最後) もし >> "動物"でも"植物"でも文字列を入力した場合、 << ということであれば後者なので、それだとBooleanは必要なくforループの後に単純にlivingthing()を呼ぶだけで足りるかと思います。 あと無限ループにならないように終了させるコマンドも必要です。

a-kuma3さんのコメント
条件にヒットしない文言を入力された場合に、もう一度入力を促す、という意味だと解釈しています。 # 「横から」は気にしません。というか、情報量が増えるので、質問者目線では、歓迎です

moon-fonduさんのコメント
はい、a-kuma3さんのおっしゃる通りの意味です。bnnさんのご指摘の通り、すみません、ちょっと言葉足らずでした。確かに、"動物"や"植物"で一致した場合の想定については、特に考えてなかったです。 一致しなかった時だけで大丈夫です。その際に、再入力ができれば。 a-kuma3さんの修正箇所を反映してみました。 すると、コンソール上に。 ------------------------- 種別を入力してください: 胴部うt 種別がありません。再度入力してください。Exception in thread "main" 種別を入力してください: java.util.NoSuchElementException: No line found at java.base/java.util.Scanner.nextLine(Unknown Source) at testprogramm.oshiete.livingthing(oshiete.java:9) at testprogramm.oshiete.livingthing(oshiete.java:36) at testprogramm.ikimono.main(ikimono.java:8) ------------------------- といったメッセージが出てきてしまいまして…。私が入れる場所を間違えてしまった? のかもしれません。ikimono.javaファイルは変更せず、oshiete.javaファイルの方を、 https://gist.github.com/AuroraNorthernQuarter/66679e544805becb948fd07b4e576b5e のように変更しました。 度々申し訳ないのですが、エラーを消すためにどうすればよいでしょうか。

a-kuma3さんのコメント
Scanner の close は、一回しか効かないみたいです。 livingthing() メソッドの後半を、以下のように書き換えてください。 >|java| boolean found = false; while (! found) { for (int i = 0; i < 4; i++) { if (hensuunitsusite.equals(syubetsu[i])) { System.out.println(animal[i]); System.out.println(tousuu[i]); found = true; } } if (! found) { System.out.println("種別がありません。再度入力してください。"); System.out.print("種別を入力してください: "); } } scan.close(); ||<

bnnさんのコメント
これですと、「植物」と入力した場合に found = true で終了しますが、 それ以外の文字列で無限ループになってしまわないでしょうか。 そもそも scan.nextLine()の位置が少し良くない気がするので、配列も見やすいように最初から書き換えてみると >|java| public void livingthing() { String[] syubetsu = {"動物","動物","動物","植物"}; String[] animal = {"キリン","ライオン","ゴリラ","ひまわり"}; String[] tousuu = {"7頭","3頭","5頭","1本"}; String hensuunitsusite; Scanner scan = new Scanner(System.in); boolean found = false; System.out.print("種別を入力してください: "); while (!found) { //※ hensuunitsusite = scan.nextLine(); for (int i = 0; i < 4; i++) { //入力がsyubetsuにあるか確認 if (hensuunitsusite.equals(syubetsu[i])) { found = true; //一致があれば break; //ループ終了 } } if (found) { //一致があれば出力する for(int i = 0; i < 4; i++) { if (hensuunitsusite.equals(syubetsu[i])) { System.out.println(animal[i]); System.out.println(tousuu[i]); } } } else { //一致がなければ入力を促し※に戻る System.out.println("種別がありません。再度入力してください: "); } } scan.close(); } ||<

a-kuma3さんのコメント
>> それ以外の文字列で無限ループになってしまわないでしょうか。 << ならないですよ。 found は、true に変更されるか、初期値の false を引っ張るかのどちらかなので、最後の "植物" と不一致でも false には戻りません。

bnnさんのコメント
確かに見落としてました。それなら大丈夫そうです。 後は再入力が無いと"動物"でも"植物"でもない場合に無限ループしてしまうので、 >|java| if (! found) { System.out.println("種別がありません。再度入力してください。"); System.out.print("種別を入力してください: "); hensuunitsusite = scan.nextLine(); //←これ } ||< で完成ですかね。

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

moon-fonduさんのコメント
遅くなりましてすみません(;'∀') a-kuma3さん、bnnさん、ありがとうございます。 「hensuunitsusite = scan.nextLine(); //←これ」の一文で無限ループ止まるんですね?そんな機能?があるんですね、この一文に。 bnnさんが書いてくださったプログラムもいい感じに動きました! ありがとうございました。

2 ● bnn
●750ポイント

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


moon-fonduさんのコメント
ありがとうございます、そうですよね。bnnさんがご回答いただいたように、自分も詳らかに処理を分析出来たらいいのですが…まだその知識がないレベルです。

bnnさんのコメント
ここまで書けるのであれば分析とか知識というより、本当にたどっていくだけなんです。 iが0から始まって、if?elseを通って何が出力されるか。 iが1になったら、2なら、3ならと順に紙に書いていくだけです。 急いでforループを形だけで覚えようとすると、掛け算の意味を知らないまま九九を覚えるようなもので、後々あまり役に立たないです。最初の方はループ毎にどう処理されているのかを実際にたどってみるというのは必要な事だと思います。

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ