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

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

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

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

Q&A

解決済

2回答

545閲覧

キーボード入力後の分岐 Javaで数独の問題を作成

anpan___

総合スコア28

Java

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

0グッド

0クリップ

投稿2019/08/19 04:13

編集2019/08/19 06:49

修正後のコード

java

1public static void create(int[][] x) { 2 int[][] data2; 3 Scanner s = new Scanner(System.in); 4 System.out.println("難易度を選択してください"); 5 System.out.print("(1)簡単/(2)普通/(3)難しい"); 6 int n = s.nextInt(); 7 System.out.println("選択した数字は" + n + "です。"); 8 if (n == 1) { 9 data2={{1,1,1,0,1,1,0,0,0},{0,0,0,1,0,0,1,0,0},{1,1,1,1,0,1,0,1,0},{0,0,0,0,1,0,0,1,0},{1,1,1,0,1,0,1,0,1},{0,0,0,0,0,1,0,0,1},{0,1,1,1,0,1,1,1,0},{7,0,0,3,0,0,0,0,0},{1,0,0,0,0,0,1,1,1}}; 10 11 } else if (n == 2) { 12 data2={{1,0,1,0,1,1,0,0,0},{0,0,0,0,1,1,0,0,0},{0,0,0,0,0,1,0,1,1},{0,1,0,1,0,0,1,0,1},{1,0,0,0,0,0,0,0,1},{1,0,1,0,0,1,0,1,0},{1,1,0,1,0,0,0,0,0},{0,0,0,1,1,0,0,0,0},{0,0,0,1,1,0,1,0,1}}; 13 14 } else if (n == 3) { 15 data2={{0,1,0,0,0,1,0,0,0},{1,1,1,1,0,1,0,0,0},{0,0,0,0,0,0,1,0,0},{0,0,1,0,0,0,0,1,1},{1,0,0,1,1,1,0,0,1},{1,1,0,0,0,0,1,0,0},{0,0,1,0,0,0,0,0,0},{0,0,0,1,0,1,1,1,1},{0,0,0,1,0,0,0,1,0}}; 16 } else { 17 System.out.println("半角で1~3の値を入力してください。"); 18 } 19 for (int i = 0; i < 9; i++) { 20 for (int j = 0; j < 9; j++) { 21 if (data2[i][j] == 0) { 22 data1[i][j] = 0; 23 } 24 } 25 } 26 Sub.print(data1); 27 }

ご指摘いただいたように、変数の部分を編集しました。
結果としては
・変数定数はイニシャライザーにおいてのみ使用可能です
といったエラーが表示される現状です。

現在数独の問題を作成するプログラムを作っています。
その中で、難易度選択をもうけており、それに準じた問題を作成するようにしています。

Scannerを用いて、難易度を選択でき、その回答によって
if文で分岐させたいのですが、うまくいっていない状態です。

うまくいっていない部分は、下記のスクリプト内で
・scannerの部分を飛ばし、if文にいきなり入る。
・for文内のdata2とif文内のdata2が別物の扱いを受ける

この対処法がわからずに困っております。
初心者ですので、至らない点だらけだと思いますが、よろしくお願いします。

以下問題の発生している点です。

java

1 public static void create(int[][] x) { 2 Scanner s = new Scanner(System.in); 3 System.out.println("難易度を選択してください"); 4 System.out.print("(1)簡単/(2)普通/(3)難しい"); 5 int n = s.nextInt(); 6 System.out.println("選択した数字は" + n + "です。"); 7 if (n == 1) { 8 int[][] data2 = { { 1, 1, 1, 0, 1, 1, 0, 0, 0 }, 9 { 0, 0, 0, 1, 0, 0, 1, 0, 0 }, 10 { 1, 1, 1, 1, 0, 1, 0, 1, 0 }, 11 { 0, 0, 0, 0, 1, 0, 0, 1, 0 }, 12 { 1, 1, 1, 0, 1, 0, 1, 0, 1 }, 13 { 0, 0, 0, 0, 0, 1, 0, 0, 1 }, 14 { 0, 1, 1, 1, 0, 1, 1, 1, 0 }, 15 { 7, 0, 0, 3, 0, 0, 0, 0, 0 }, 16 { 1, 0, 0, 0, 0, 0, 1, 1, 1 } }; 17 18 } else if (n == 2) { 19 int[][] data2 = { { 1, 0, 1, 0, 1, 1, 0, 0, 0 }, 20 { 0, 0, 0, 0, 1, 1, 0, 0, 0 }, 21 { 0, 0, 0, 0, 0, 1, 0, 1, 1 }, 22 { 0, 1, 0, 1, 0, 0, 1, 0, 1 }, 23 { 1, 0, 0, 0, 0, 0, 0, 0, 1 }, 24 { 1, 0, 1, 0, 0, 1, 0, 1, 0 }, 25 { 1, 1, 0, 1, 0, 0, 0, 0, 0 }, 26 { 0, 0, 0, 1, 1, 0, 0, 0, 0 }, 27 { 0, 0, 0, 1, 1, 0, 1, 0, 1 } }; 28 29 } else if (n == 3) { 30 int[][] data2 = { { 0, 1, 0, 0, 0, 1, 0, 0, 0 }, 31 { 1, 1, 1, 1, 0, 1, 0, 0, 0 }, 32 { 0, 0, 0, 0, 0, 0, 1, 0, 0 }, 33 { 0, 0, 1, 0, 0, 0, 0, 1, 1 }, 34 { 1, 0, 0, 1, 1, 1, 0, 0, 1 }, 35 { 1, 1, 0, 0, 0, 0, 1, 0, 0 }, 36 { 0, 0, 1, 0, 0, 0, 0, 0, 0 }, 37 { 0, 0, 0, 1, 0, 1, 1, 1, 1 }, 38 { 0, 0, 0, 1, 0, 0, 0, 1, 0 } }; 39 } else { 40 System.out.println("半角で1~3の値を入力してください。"); 41 } 42 for (int i = 0; i < 9; i++) { 43 for (int j = 0; j < 9; j++) { 44 if (data2[i][j] == 0) { 45 data1[i][j] = 0; 46 } 47 } 48 } 49 Sub.print(data1); 50 }

ErrorMessage

1Exception in thread "main" java.lang.Error: Unresolved compilation problems: 2 重複ローカル変数 data2 3 重複ローカル変数 data2 4 重複ローカル変数 data2 5 6 at sudoku.SudokuCreate.create(SudokuCreate.java:92) 7 at sudoku.SudokuCreate.placement(SudokuCreate.java:42) 8 at sudoku.SudokuCreate.placement(SudokuCreate.java:45)

以下、コード全体を記載させていただきます。
まだ、1つのクラスで書いてしまっているので、見にくくなってしまっていますが、もしよかったら見てください。
※Sub = 細々としたスクリプトが入っているクラス

java

1import java.util.Scanner; 2 3public class SudokuCreate { 4 5 private static int[][] data1 = { { 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 { 2, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 { 3, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 { 4, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 { 5, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 { 6, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 { 7, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 { 8, 0, 0, 0, 0, 0, 0, 0, 0 }, 13 { 9, 0, 0, 0, 0, 0, 0, 0, 0 } }; 14 15 public static void main(String[] args) { 16 Sub.print(data1); 17 placement(data1); 18 } 19 20 public static void placement(int[][] data1) { 21 for (int i = 0; i < 9; i++) { 22 for (int j = 0; j < 9; j++) { 23 if (data1[i][j] == 0) { 24 int[] kl = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //候補値を格納するための配列 25 cr(i, kl); //行の重複チェックメソッドを実行 26 cc(j, kl); //列の重複チェックメソッドを実行 27 cb(i, j, kl); //ブロックの重複チェックメソッドを実行 28 for (int k = 0; k < 9; k++) { 29 if (kl[k] == 0) { 30 data1[i][j] = k + 1; 31 int count = 0; 32 for (int r = 0; r < 9; r++) { 33 for (int c = 0; c < 9; c++) { 34 if (data1[r][c] != 0) 35 count++; 36 } 37 } 38 if (count == 81) { 39 Sub.print(data1); 40 create(data1); 41 System.exit(0); 42 } else { 43 placement(data1); //値挿入後に矛盾がないかを確認 44 } 45 } 46 } 47 data1[i][j] = 0; //バックトラッキング 48 return; 49 } 50 } 51 } 52 } 53 54 //行の重複をチェックするメソッド 55 public static void cr(int r, int[] kl) { 56 for (int i = 0; i < 9; i++) { 57 if (data1[r][i] != 0) { 58 kl[data1[r][i] - 1] = 1; 59 } 60 } 61 } 62 63 //列の重複をチェックするメソッド 64 public static void cc(int c, int[] kl) { 65 for (int i = 0; i < 9; i++) { 66 if (data1[i][c] != 0) { 67 kl[data1[i][c] - 1] = 1; 68 } 69 } 70 } 71 72 //ブロックの重複をチェックするメソッド 73 public static void cb(int r, int c, int[] kl) { 74 int sr = r / 3 * 3; 75 int sc = c / 3 * 3; 76 for (int s = sr; s < sr + 3; s++) { 77 for (int b = sc; b < sc + 3; b++) { 78 if (data1[s][b] != 0) 79 kl[data1[s][b] - 1] = 1; 80 } 81 } 82 } 83 84 public static void create(int[][] x) { 85 Scanner s = new Scanner(System.in); 86 System.out.println("難易度を選択してください"); 87 System.out.print("(1)簡単/(2)普通/(3)難しい"); 88 int n = s.nextInt(); 89 System.out.println("選択した数字は" + n + "です。"); 90 if (n == 1) { 91 int[][] data2 = { { 1, 1, 1, 0, 1, 1, 0, 0, 0 }, 92 { 0, 0, 0, 1, 0, 0, 1, 0, 0 }, 93 { 1, 1, 1, 1, 0, 1, 0, 1, 0 }, 94 { 0, 0, 0, 0, 1, 0, 0, 1, 0 }, 95 { 1, 1, 1, 0, 1, 0, 1, 0, 1 }, 96 { 0, 0, 0, 0, 0, 1, 0, 0, 1 }, 97 { 0, 1, 1, 1, 0, 1, 1, 1, 0 }, 98 { 7, 0, 0, 3, 0, 0, 0, 0, 0 }, 99 { 1, 0, 0, 0, 0, 0, 1, 1, 1 } }; 100 101 } else if (n == 2) { 102 int[][] data2 = { { 1, 0, 1, 0, 1, 1, 0, 0, 0 }, 103 { 0, 0, 0, 0, 1, 1, 0, 0, 0 }, 104 { 0, 0, 0, 0, 0, 1, 0, 1, 1 }, 105 { 0, 1, 0, 1, 0, 0, 1, 0, 1 }, 106 { 1, 0, 0, 0, 0, 0, 0, 0, 1 }, 107 { 1, 0, 1, 0, 0, 1, 0, 1, 0 }, 108 { 1, 1, 0, 1, 0, 0, 0, 0, 0 }, 109 { 0, 0, 0, 1, 1, 0, 0, 0, 0 }, 110 { 0, 0, 0, 1, 1, 0, 1, 0, 1 } }; 111 112 } else if (n == 3) { 113 int[][] data2 = { { 0, 1, 0, 0, 0, 1, 0, 0, 0 }, 114 { 1, 1, 1, 1, 0, 1, 0, 0, 0 }, 115 { 0, 0, 0, 0, 0, 0, 1, 0, 0 }, 116 { 0, 0, 1, 0, 0, 0, 0, 1, 1 }, 117 { 1, 0, 0, 1, 1, 1, 0, 0, 1 }, 118 { 1, 1, 0, 0, 0, 0, 1, 0, 0 }, 119 { 0, 0, 1, 0, 0, 0, 0, 0, 0 }, 120 { 0, 0, 0, 1, 0, 1, 1, 1, 1 }, 121 { 0, 0, 0, 1, 0, 0, 0, 1, 0 } }; 122 } else { 123 System.out.println("正しい値を入力してください。"); 124 } 125 for (int i = 0; i < 9; i++) { 126 for (int j = 0; j < 9; j++) { 127 if (data2[i][j] == 0) { 128 data1[i][j] = 0; 129 } 130 } 131 } 132 Sub.print(data1); 133 } 134} 135

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

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

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

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

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

guest

回答2

0

インデントちゃんと揃えてもらったほうが良いです。
それで起きる不具合もありますので。

エラー内容(重複)だけで言うと

public static void create (int[][] data1, int[][] data2) {

引数で来ているのに、その引数を受けているメソッドの中でわざわざint[][] data2などと定義しているためではないでしょうか。

状況再現するミニマムコード例

java

1 public static void hoge(String t){ 2 String t = "b"; 3 } 4//error: variable t is already defined in method hoge(String)

投稿2019/08/19 04:18

編集2019/08/19 04:32
m.ts10806

総合スコア80850

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

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

anpan___

2019/08/19 04:46

ご指摘ありがとうございます。引数の部分修正させていただきました。
m.ts10806

2019/08/19 04:49

インデントもお願います。 ただ、修正したことにより状況はどうなったのでしょうか。
anpan___

2019/08/19 05:04

インデントのほうも修正させていただきました! 結果として、スキャナーを用いることはできたのですが、 createメソッド内の if文の中に3つあるdata2が使用されていない。とエラーメッセージが表示されます。 for文内で用いておりますがそこがうまくいっていない点です。
m.ts10806

2019/08/19 05:12

>インデントのほうも修正させていただきました! えっと、どこがでしょうか・・そんなに変わった印象を持てませんでした。 IDE使っているのでしたら手で修正するのではなくコードフォーマット機能を利用したほうが早く確実です >if文の中に3つあるdata2が使用されていない。とエラーメッセージが表示されます これは単に警告かと思います。というか手元ではそのような警告はできていませんが・・ cleanして再ビルドしてみては?
m.ts10806

2019/08/19 05:17

あぁ分かった・・ インデント部分は質問のコードに手を入れるのではなく 手元のコードを揃えてからコピペしてください。全角空白混じってますよ。
m.ts10806

2019/08/19 05:32 編集

あといまのif文の作りではelseに入ったときにdata2が定義されていない状態になります。 空でもいいのでifの外で定義したうえで各分岐に値を入れるべきですね。ただその場合だとelseに入ったときにNullPointerExceptionがでると思うので、ifを抜けるのではなくcreate()を実行させてreturnするなど工夫が必要です。
anpan___

2019/08/19 05:39

インデントに関しては、フォーマットを使い修正することができました! 教えていただきありがとうございます。 上記3つ目のコメントに関してですが、今から修正を行いますので、今しばらくお待ちいただければ幸いです。
m.ts10806

2019/08/19 05:43

別回答でも挙げられていますが、あくまで変数のスコープの問題ですね(もちろん未定義のパターンがあることも問題)
anpan___

2019/08/19 06:26

if文以前に、data2を定義し、if文の中では初期化を行おうとしたのですが data2[9][9] = { { 1, 1, 1, 0, 1, 1, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 1, 0, 0 }, { 1, 1, 1, 1, 0, 1, 0, 1, 0 }, { 0, 0, 0, 0, 1, 0, 0, 1, 0 }, { 1, 1, 1, 0, 1, 0, 1, 0, 1 }, { 0, 0, 0, 0, 0, 1, 0, 0, 1 }, { 0, 1, 1, 1, 0, 1, 1, 1, 0 }, { 1, 0, 0, 1, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 1, 1, 1 } }; 初期化方法は、こう行った風に定義させていただいたんですが、間違っていますでしょうか…? if文内の3つのdata2をs上記のように修正したところ、警告として ・配列定数はイニシャライザーにおいてのみ使用可能です。 と表示されている現状です。
m.ts10806

2019/08/19 06:30 編集

普通に int[][] data2; だけで良いのでは。 で、if内の[ int[][] ]は外す。
anpan___

2019/08/19 06:40

そちらの方法も試させていただいたのですが、変わらずエラーが発生してしまいました… 修正させていただいたものを再度質問の上部に記載させていただきましたので、かくにんしていただければさいわいです。
m.ts10806

2019/08/19 06:46

編集するたびにコードが滅茶苦茶になっているような。 create()でプロパティのdata1を利用するなら引数で渡す必要ないですし、引数で受け取ったx使われてないですし。 「配列定数はイニシャライザーにおいてのみ使用可能です」は文言の通りです。初期化にしか使えませんので、別の方法で配列内容の情報を作ってください。
m.ts10806

2019/08/19 06:54

一番簡単なのは、結局「定義」するだけで中身が改変されるわけではないデータ ということでfinalキーワードでもつけてプロパティにしておいて 適宜data2に代入することでしょうか。 データとなるものをあまりコードに直接持っておくのはメンテナンス性に乏しいのでJSONなど別の形で持っておいたほうが良いとは思います
guest

0

ベストアンサー

追記

>変数定数はイニシャライザーにおいてのみ使用可能です

配列に中かっこ {}←を用いて値を代入できるのは、宣言と同時に行う際のみになります。

java

1//OK 2String[] hoge = {"hoge1","hoge2"...}; 3 4//コンパイルエラー(変数定数は・・・) 5String[] fuga; 6fuga = {"fuga1","fuga2"...};

全体を見直さずに簡単に解決する方法としては
if文の外で最終的に使いたい配列(今回ならばdata2)を定義(宣言のみ)
if文内で実際の中身をdata3(一例)として定義、中身を入れる
最後にdata2 = data3としてみてはどうでしょう。とりあえずエラーは消えるかと。

for文内のdata2とif文内のdata2が別物の扱いを受ける

質問時点でのコードでは、createメソッドの引数としてdata2を受け取っていましたが
現在のコードだとif文中で初めてdata2を定義しています。
if文中で宣言した変数はその外で扱うことができないため、for文中のdata2は未定義の状態です。

java

1 if(条件) { 2 String hoge = "hoge"; 3 //hoge 4 System.out.println(hoge); 5 } 6 7 //コンパイルエラー 8 System.out.println(hoge);

投稿2019/08/19 05:29

編集2019/08/19 06:59
tetutetu

総合スコア419

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

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

anpan___

2019/08/19 06:39

回答ありがとうございます! 修正前の質問内容、現在の内容ともに、if文より前に変数data2を定義させていただきました。 その際に、if文内で 初期化を行いたいのですが、二次元配列を初期化してもエラーが出てしまう状態です。 その修正したプログラムを再度質問内に記載しましたので、見ていただければ幸いです。
tetutetu

2019/08/19 06:46

編集日時が2019/08/19 14:36 になっており、恐らく編集が反映されていないものと思われます。
anpan___

2019/08/19 06:50

大変失礼しました。おっしゃる通りでした! 今一度修正させていただきました。
tetutetu

2019/08/19 06:58

追記しました。
tetutetu

2019/08/19 07:03

恐らく上記方法でdata2にcreateメソッドで作成した配列の中身を入れること自体は実現できますが 全て読んだわけではないですが別回答でも指摘されてる通り大分滅茶苦茶になって来ている気がします。 この方法でそのまま実装を進めるのではなく、こういった方法で初期化済みの配列に後から値を一括で入れることができるんだな、程度に留めておいたほうがよさそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問