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

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

ただいまの
回答率

90.04%

JAVAの配列がよくわかりません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,155

ain4425

score 17

3桁の数字を入力して、数も場所もあっている(ヒット)のは何個で、数だけあっている(ブロー)は何個かを随時教えてくれるプログラムを書いています。
正解の数字は乱数で出しています。また、何回もできるようにループさせています。
答え合わせのしやすいように、初めに正解の数字は表示させています。
解答者が入力した数字をi[a]という配列(?)に代入したところくらいからよくわからなくなってしまいました。
現在何を入力しても0個と0個が表示されてしまいます。
java初心者のため、どこがどう違うのか分かりやすく教えていただけると幸いです。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
      int[] answerNumList = new int[3];
      System.out.println("3桁の数字を当ててください");
      System.out.println("3桁の数字は重複しません");
      System.out.println("0から始まる数字も可能です(例 012)");
      System.out.println("数字と場所が合っている場合はヒット、数字だけが合っていたらブローとしてその数が表示されます");
      System.out.print("正解 ");
      //0~9が入ったList を生成
      ArrayList<Integer> tempNumList = new ArrayList<Integer>();
      for(int i = 0; i < 10; i++){
          tempNumList.add(i);
      }
      //Listからランダムに数字を取り出して3桁の数を生成
      for(int i = 0; i <answerNumList.length; i++){
          int selectNum = (int)(Math.random() * tempNumList.size());
          answerNumList[i] = tempNumList.remove(selectNum);
      }
      for(int i=0; i < answerNumList.length; i++){
          System.out.print(answerNumList[i]);
          if(i != answerNumList.length -1)
              System.out.print( "  ");
      }
      //入力後のステップ
      while(true){
          try{
              System.out.println();
              System.out.println("3桁の数字を入力してください。");
              BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
              String str = br.readLine();

              int num = Integer.parseInt(str);
              int a[]=new int[num];

              //エラーの初期化、エラーをfalseにしておく
              boolean error = false;
              int length = str.length();
              //3桁でない数が入力されたときエラーをtrueにする
              if (length != 3)
                  error = true;
              //同じ数が入力されたときエラーをtrueにする
              for(int i = 0 ; i < length; i++) {
                  for(int j =i +1; j < length; j++) {
                      if(str.charAt(i) == str.charAt(j))
                          error = true;
                }
              }
              //エラーの時の画面表示
              if(error == true){
                System.out.println("入力エラーです。");
                System.out.println("0~9までの数値を3桁で重複しないように入力してください。");
            }

              if(error == false){
              //hitの初期化
              int hit = 0;
              for(int i = 0; i < answerNumList.length; i++)
              {
                  if ( a[i] == answerNumList[i])
                  {
                      hit++;
                  }
              }
              //blowの初期化
              int blow = 0;
              for(int i = 0; i < 3; i++)
              {
                  for(int j = 0; j <answerNumList.length; j++)
                  {
                      if( a[i] == answerNumList[j])
                      {
                          blow++;
                      }
                  }
              }
              if(hit == answerNumList.length)
              {
                  System.out.println("正解です.");
              }
              else
              {
                  System.out.println("ヒット" + hit + "個," + "ブロー" + (blow - hit)+ "個");
              }
              }


          }
          catch(IOException e){
          e.printStackTrace();
          }
      }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

String str = br.readLine();
int num = Integer.parseInt(str);
int a[]=new int[num];


これは、例えば"123"と入力した際、長さ123の配列を作成している事になります。どんな数を入れようともこの配列の中身はすべて0なので、答えの数値に0が入っていないかぎりヒットもブローもしないことになります。

ではどうするか?

  • 文字列の各文字を取り出して、'0'との差で数値にする(数値であることのチェックなどが事前に必要)
String str = br.readLine();
int[] a = new int[answerNumList.length];

for (int i = 0; i < answerNumList.length; i++) {
    a[i] = str.charAt(i) - '0';
}
  • 文字列を分解し、各文字をparseInt
String str = br.readLine();
int[] a = new int[answerNumList.length];
String[] split = str.split("");

for (int i = 0; i < answerNumList.length; i++) {
    a[i] = Integer.parseInt(split[i]);
}
  • 数値変換し、剰余算で各桁を取り出す(コード略)

など、やりようはいくらかあります。


なお、他にも

  • 正解の数設定が各桁ランダムになる保証がないので、shuffleなどを使って並べ替えてから取り出すべき
  • ヒット、ブローの判定が二度手間。
  • メソッドに切り分けて処理するべき(入力が適正かどうかの判定など)

など、いくつか問題を抱えているようです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/22 02:09

    回答ありがとうございます。では、配列そのものの中身に数を入れたければどう表記すればいいのでしょうか

    キャンセル

  • 2016/07/22 02:50

    各文字の分解が自分なりに分かりやすいのでそれでやっていこうと思います。いろいろなやり方を提示していただきありがとうございました。
    その他の問題点も含め、勉強していこうと思います!

    キャンセル

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

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