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

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

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

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

Q&A

解決済

2回答

11976閲覧

桁数を判定して、4桁の数が入力されるまで繰り返すメソッド

TSho

総合スコア21

Java

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

0グッド

0クリップ

投稿2017/12/24 07:58

編集2017/12/24 11:13

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
Javaで4桁の乱数を当てるHitBlowを作っています。5桁以上なら「多すぎます。4桁になるようにしてください。」3桁以下なら、「桁が少ないです。4桁の整数を入力してください。」と表示され,4桁なら以降に続くようにしたいです。
###発生している問題・エラーメッセージ

エラーメッセージ ArrayIndexOutOfBorderException もともと指定した配列の要素数を超えた値を入力されたためエラーが出ました。

###該当のソースコード

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class HitBlow { public static void Ransuu() { //4桁の重複ない乱数を作り値を送るメソッド int[] answer = new int[4]; for (int i = 0; i < answer.length; i++) { Loop: while (true) { answer[i] = (int) (Math.random() * 10); //0~9の数値を入れる for (int j = 0; j < i; j++) { //その前までの数値のどれかとかぶっていたら数値代入からやり直し if (answer[j] == answer[i] || answer[0] == 0) continue Loop; } break; } } //とりあえず出力させています。 for (int x : answer) { System.out.print(x); } } public static void Ketasuu(int n) { //桁数を判定するメソッド int digits = 0; while (n > 0) { digits++; n /= 10; } if (digits > 4) { System.out.println("桁数が多いです。桁数を4桁にしてください"); } else if (digits < 4) { System.out.println("桁数が少ないです。桁数を4桁にしてください"); } } public static void toInt(String[] n, int[] m) { //String型の要素をint型配列に格納するメソッド for (int i = 0; i < n.length; i++) { m[i] = Integer.parseInt(n[i]); } } public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ Ransuu(); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); try { int num = 0; String[] input = new String[4]; int[] input2 = new int[4]; Flag: while (true) { String b = a.readLine(); Ketasuu(num = Integer.parseInt(b)); input = b.split("", 0); toInt(input, input2); } } catch (IOException e) { System.out.println(e); } } }

###試したこと
課題に対してアプローチしたことを記載してください
boolean型のメソッドを作り、メソッド内で桁数を判定したのですが、true falseの2択で両方continue させたいので分岐が足りませんでした。4桁より多い、少ない、4桁の3択で分岐させたいです。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

ベストアンサー

単に『4桁であるか』が分かればいいのであれば、1000 <= x < 10000で充分なのでは。
ただし、期待される入力は正の整数とします。

サンプル

『数字に重複のない、n桁の数値を返す静的メソッド』のサンプル

Java

1static int retNDigitsNumWithoutOverlap(int digitNum) { 2 if(digitNum <= 0) throw new IllegalArgumentException(); 3 if(10 < digitNum) throw new IllegalArgumentException(); 4 5 List<Integer> digits = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); 6 do { 7 Collections.shuffle(digits); 8 } while(digits.get(0) == 0); 9 10 int ret = 0; 11 for(int digit: digits.subList(0, digitNum)) { 12 ret *= 10; 13 ret += digit; 14 } 15 16 return ret; 17}

『正の整数の桁数を計算する静的メソッド』のサンプル

Java

1static int computeNumOfDigit(int num) { 2 if(num < 0) throw new IllegalArgumentException(); 3 if(num == 0) return 1; 4 5 return (int)Math.log10(num) + 1; 6}

巨大な数が入力されないと保証できるのであれば、次のように書いても良いでしょう。

Java

1static int computeNumOfDigit(int num) { 2 if(num < 0) throw new IllegalArgumentException(); 3 for(int i = 1, p = 10; true; ++i, p *= 10) { 4 if(num < p) return i; 5 } 6}

『n桁の数値が入力されるまで、再入力を求める静的メソッド』のサンプル

Java

1static int scanInteger(BufferedReader br, String message) throws IOException { 2 while(true) { 3 try { 4 System.out.print(message); 5 return Integer.parseInt(br.readLine()); 6 } catch(NumberFormatException e) {} 7 } 8} 9static int scanNDigitInteger(BufferedReader br, String message, int digitNum) throws IOException { 10 while(true) { 11 int input = scanInteger(br, message); 12 if(computeNumOfDigit(input) == digitNum) return input; 13 } 14}

実行イメージは以下のとおりです。

input 4 digit num: hoge input 4 digit num: asffdsa input 4 digit num: 23 input 4 digit num: 34234 input 4 digit num: 3425 3425

投稿2017/12/24 08:04

編集2017/12/25 11:08
LouiS0616

総合スコア35660

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

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

TSho

2017/12/24 08:20

回答ありがとうございます。4桁より多いか少ないか4桁かの3択限定です。
LouiS0616

2017/12/24 09:08 編集

それならif(x < 1000) {} else if(x < 10000) {} elseが一番素直かと。
LouiS0616

2017/12/24 09:08 編集

いろいろと難しく考えすぎだと感じたので、ちょっとサンプルを書いてみました。
TSho

2017/12/24 11:16

ありがとうございました。たしかに簡単なことを難しく考えてしまっていました。
guest

0

読みにくいです。

ソースコードは"</>" で出てくるやつの 「中に」記述してください。

外側になっていますよ。

Boolは true/falseの2値です。

よって3択以上には適さないです。

ではどうするか。

intで代用する。

少ない: -1 ちょうど: 0 多い: 1

みたいに。

別に-1,0,1 じゃなくてもいいです。あるいは桁数を取得するメソッドを作り、

戻り値が 4 なら ちょうどいい。

...みたいに。

桁数を取得する場合は、

私なら

方法1: 数直線で考えて、4桁になるように考える

たとえば、

4桁って 1000~9999 ですよね。

この範囲に入っているかどうかで考える。

多い、少ない...だったら、

少ない: 1000 未満 ( 999以下 )
多い: 10000以上

とか。

後は邪道ですが、

方法2: 文字列として考える

文字列なら Stringのlengthメソッドで取得すればいい。

投稿2017/12/24 08:10

BeatStar

総合スコア4958

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

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

TSho

2017/12/24 08:33

回答ありがとうございます。intを作ってその値を返すやり方でやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問