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

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

ただいまの
回答率

89.10%

4桁の数字を入れた配列をfor文で抽出したい

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 476

oisii

score 6

前提・実現したいこと

乱数と入力した4桁の数字の配列をfor文で回して同じ桁に同じ数字がある場合〇違う桁に同じ数字がある場合△となるプログラムを作りたいのですがforまでいかず
数字を入力して無限ループになります

該当のソースコード

package game;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class MathGame {

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        System.out.println("ゲームを始めます");
        int answer[] = new int[4];
        answer[0] = (int) (Math.random() * 9) + 1;
        for (int i = 1; i < answer.length; i++) {
            int num = -1;
            for (boolean isNotExist = false; !isNotExist;) {
                num = (int) (Math.random() * 10);
                isNotExist = true;
                for (int j = 0; j < answer.length; j++) {
                    if (answer[j] == num) {
                        isNotExist = false;
                        break;
                    }
                }
            }
            if (num < 0) {
                // ここにきたらバグ
                throw new IllegalStateException();
            }
            answer[i] = num;
        }
        Arrays.stream(answer).forEach(System.out::println);

        int input[] = new int[4];
        boolean validated = false;
        while (!validated) {
            int a = 0;
            for (int n = 0; a < input.length; a++) {
                System.out.println("4文字の数字を入力してください");
                String sc = new Scanner(System.in).nextLine();
                if (sc.length() == 4) {
                    System.out.println("4文字だけ入力されました。");
                    validated = true;
                } else {
                    System.out.println("4文字だけ入力してください。");
                    break;
                }
              }
            }
                    List<Integer> result = new ArrayList<Integer>();
                    for(int a : answer){
                       for(int b : input){
                         if(a == b){
                             result.add(a);
                           break;
                }
            }
        }
        System.out.println("ListA = " + answer);
        System.out.println("ListB = " + input);
        System.out.println("ListC = " + result);
          }
        }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • oisii

    2020/03/12 14:25

    >それと質問ですが、「for (boolean isNotExist = false; !isNotExist;) 」は何?
    乱数生成時に4桁の乱数の数字が重複しないよう書きました。

    キャンセル

  • yoorwm

    2020/03/12 14:51

    質問する前にまずは真面目にJavaを学習するべきでは?

    キャンセル

  • jimbe

    2020/03/13 12:50

    > forまでいかず数字を入力して無限ループになります
    どこの for でしょう.
    どのような数字を入力して無限ループとなったのか, 具体的な入力と表示の流れをご提示願えますか.

    キャンセル

回答 3

+2

最初に answer を求めていますが、その answer には 0 が含まれることがありません。
乱数で 0~9 を求めて、既に出た数と比較して同じものがあるかどうか確かめないと
いけないのに、4つの数すべてと比較していますから。

配列に乱数4桁を格納して画面出力が解決済みになっているのに、
その回答が活かされていませんね。

Arrays.stream(answer).forEach(System.out::println);
これは意味が分かって使っていますか?
なぜ元は print だったのを println にしたんですか?

List<Integer> result = newe ArrayList<Integer>(); 以降、
インデントが変なのはなぜですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

現在の質問者様ですと希望の実装は難しいと思います。
実務で対応しているようでしたら上長に報告、勉強でしたら一度javaの基礎を固めた方がよろしいと思います。

  • 参考

プロゲート

for文、拡張for文、forEachの使い方

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

以下は動作している Hit&Blow のコードですが, 参考のみでお願いします.
入力は inputAnswer メソッドです.
judge メソッドで二つの int 配列を比較して hit と blow をカウントしています.
表示の〇△の文字列化は, Judgment クラスの getImageString メソッドが行っています.

import java.util.*;

public class HitAndBlow {
  private static final int DIGITS = 4;
  public static void main(String[] args) {
    System.out.println("ゲームを始めます");
    try(Scanner scanner = new Scanner(System.in);) {
      int[] correct = createCorrect(DIGITS);
      while(true) {
        int[] answer = inputAnswer(DIGITS, scanner);
        Judgment result = judge(correct, answer);
        System.out.println(result.getImageString());
        if(result.exactMatch()) break;
        //System.out.println("correct = " + Arrays.toString(correct));
        //System.out.println("answer = " + Arrays.toString(answer));
        //System.out.println("result = " + result);
      }
    }
    System.out.println("ゲームを終わります");
  }
  private static int[] createCorrect(int digits) {
    List<Integer> values = Arrays.asList(0,1,2,3,4,5,6,7,8,9);
    do { Collections.shuffle(values); } while(values.get(0) == 0);
    int[] correct = new int[digits];
    for(int i=0; i<digits; i++) correct[i] = values.get(i);
    return correct;
  }
  private static int[] inputAnswer(int digits, Scanner scanner) {
    while(true) {
      System.out.println(digits+"桁の数字を入力してください");
      String line = scanner.nextLine();
      if(line.length() == digits) {
        try {
          int[] answer = new int[digits];
          for(int i=0; i<digits; i++) {
            answer[i] = Integer.parseInt(line.substring(i, i+1));
          }
          return answer;
        } catch(NumberFormatException ignore) {
          //retry
        }
      }
    }
  }
  private static Judgment judge(int[] correct, int[] answer) {
    if(correct.length != answer.length) throw new IllegalArgumentException();
    int hit = 0, blow = 0;
    for(int i=0; i<answer.length; i++) {
      for(int j=0; j<correct.length; j++) {
        if(answer[i] == correct[j]) {
          if(i == j) hit++; else blow++;
          break;
        }
      }
    }
    return new Judgment(correct.length, hit, blow);
  }
}
class Judgment {
  private int digits, hit, blow;
  Judgment(int digits, int hit, int blow) {
    this.digits = digits;
    this.hit = hit;
    this.blow = blow;
  }
  boolean exactMatch() { return hit == digits; }
  String getImageString() {
    if(hit == 0 && blow == 0) return "-";
    StringBuilder sb = new StringBuilder();
    for(int i=0; i<hit; i++) sb.append("〇");
    for(int i=0; i<blow; i++) sb.append("△");
    return sb.toString();
  }
  public String toString() {
    return super.toString()+"[digits="+digits+", hit="+hit+", blow="+blow+"]";
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる