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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1222閲覧

[Java]標準入力で同じ数値を認めない方法

keii09

総合スコア1

Java

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/03/20 14:32

java初心者です
現在、4桁の数当てゲーム(ヌメロン)を作っています

質問なのですが、標準入力で得られた数値を配列に格納したのち、その配列何に同じ数値が入っていないように確認し、入っていた場合それをやり直すようにするにはどうすればいいでしょうか?二重ループでやるのかなと考えたのですがさっぱりです。

//Aの部分から1文字ずつ入力していって、配列に格納していって、数字被りを認めないようにしたいです。
汚いコードですがよろしくお願いします。

該当のソースコード

Java

1//入力を読み込んで戻り値を返すメソッド  2 3public static int[] Us_kotae(){ 4 Scanner sc = new Scanner(System.in); 5 int[] kaitou =new int[4]; 6 System.out.println((challenge+1)+"回目の挑戦です"); 7 8//A 9 for(int f=0; f<kaitou.length; f++){ 10 int kagen=0; 11 if(f<kagen){ 12 f=0; 13 } 14 try{ 15 System.out.println((f+1)+"番目の数字を入力してください"); 16 String bb =sc.nextLine(); 17 int cc =Integer.parseInt(bb); 18 19 20 if (cc>=10 || cc<0) { 21 System.out.println("0~9を入力してください"); 22 f--; 23 throw new IllegalArgumentException(); 24 } 25 kaitou[f]=cc; 26 27 28 29 }catch(NumberFormatException e){ 30 System.out.println("正しい数字を入力して下さい"); 31 f--; 32 }catch(Exception e){ 33 System.out.println("形式が間違っています"); 34 f--; 35 } 36 }return kaitou; 37 38 39} 40 41

java

1//考えてみた処理方法 2for(int t=0;t<kaitou.length;t++){ 3 for (int z=t+1;z<kaitou.length; z++ ) { 4 if(kaitou[t]==kaitou[z]){ 5 System.out.println("同じ数字は入力できません"); 6 f--; 7 } 8 } 9 }

試したこと

上記の二重ループをtry内のint ccの次の行から入れていましたがうまくいきません
理解が乏しいのは承知の上、ご鞭撻いただけると幸いです
またループ以外のやり方もあれば参考になります。

補足情報(FW/ツールのバージョンなど)

プログラミング勉強始めて1ヶ月くらいなので自力で考えれるのがこの程度になってしまいますが、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

diff

1 int cc =Integer.parseInt(bb); 2+ for (int t = 0; t < f; ++t) { 3+ if (kaitou[t] == cc) { 4+ System.out.println("同じ数字は入力できません"); 5+ throw new IllegalArgumentException(); 6+ } 7+ } 8 if (cc>=10 || cc<0) { 9 System.out.println("0~9を入力してください"); 10 throw new IllegalArgumentException(); 11 }

ほかの部分と同じように書くならこうです。新しく入力された数字を今までの入力された数字と比較すればいいだけなので二重ループは必要ありません。後ろのifも少し修正しています。
ここに--fを入れると後ろのcatch節と合わせて2重にデクリメントされるのでバグります。

今の考えてみた処理方法では配列全体で同じ数がないかを見てるので、最初の入力ではまだ入力がないところのデフォルトの値(0)の重複が必ず見つかります。しかも見つかるたびにfをデクリメントするのでfがマイナスになります。

初心者とのことなので突っ込んだアドバイスをすると、ループの先頭で本来そうならないはずのfがマイナスになるということは何らかのバグがあるということ。それを0に戻すような処理を書くというのはバグを見つかりにくくしてるだけで、解決にならないどころか解決を難しくすることです。

投稿2021/03/20 16:38

yudedako67

総合スコア2047

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

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

keii09

2021/03/21 04:20

わかりやすい説明ありがとうございます!デフォルト値が絡んできてわかりにくくしてしまっていたのですね。また深く考えすぎていたかもしれません。もっとクリアに考えられるように頑張りたいと思います。ありがとうございました
guest

0

同じ数値が入っていないように確認し

たいのであれは、配列をつかわずに、List<Integer>を用意して、contains() https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#contains-java.lang.Object- をつかう。かな。

投稿2021/03/20 15:33

shiketa

総合スコア4061

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問