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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

配列

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

Q&A

解決済

2回答

1665閲覧

java 多次元配列について

tera12

総合スコア8

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

配列

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

1グッド

0クリップ

投稿2020/04/27 09:31

編集2020/04/27 10:39

javaの勉強をしています。
多次元配列がうまくいかずに困っています。

ポーカーを作ろうと思っています。
手札が
スペード A, ダイヤ 2, クラブ 3, ハート 4, スペード 5
のときに多次元配列の中身が,
x = {{"スペード", "A"}, {"ダイヤ", "2"}, {"クラブ", "3"}, {"ハート", "4"}, {"スペード", "5"}}
になるようにしたいのですが{"スペード", "A"}のところが{"スペード", "5"}と表示されてしまいます。

Mainのfor文のところで、模様と数字を表示させるようにしてあります。

java初心者ですので、こうするとソース短くなるよ。
などのアドバイスも頂けると幸いです。

java

1 2package game; 3 4public class Main { 5 6 public static void main(String[]args){ 7 Card_index ci = new Card_index(); 8 Keyin k = new Keyin(); 9 10 int hand = 5; 11 int joker = 2; 12 13 String[][] x; 14 15 k.println("自分"); 16 x = ci.drow(hand, joker); 17 k.println("----------------"); 18 19 /* 20 k.println("相手"); 21 ci.drow(hand, joker); 22 k.println("----------------"); 23 //ci.debug(); 24 25 */ 26 for(int i=0; i<x.length; i++){ 27 for(int j=0; j<x[i].length; j++){ 28 k.print(x[i][j]); 29 } 30 k.println(""); 31 } 32 33 ci.debug(); 34 } 35}

java

1 2package game; 3 4import java.util.ArrayList; 5 6public class Card_index { 7 8 Keyin k = new Keyin(); 9 Card[] card = new Card[5]; 10 private int i; 11 private String[][] x; 12 private int r; 13 private int d; 14 15 final String[] Black = {"スペード", "クラブ", "ジョーカー"}; 16 final String[] Red = {"ハート", "ダイヤ", "ジョーカー"}; 17 18 final String[][] Kind = {Black, Red}; 19 final int[] Sheet = {13, 2}; 20 final String[] Color = {"黒", "赤"}; 21 ArrayList<Integer> deck = new ArrayList<Integer>(); 22 23 Card_index(){ 24 reset(); 25 } 26 27 void reset(){ 28 deck.clear(); 29 30 for(i=1; i<=(Sheet[0]*4+2); i++){ 31 deck.add(i); 32 //System.out.println(deck.get(i-1)); 33 } 34 35 // カード4種設定 36 for(i=0; i<card.length-1; i++){ 37 if(i >= 2){ 38 // red 39 card[i] = new Card(Kind[1][i-2], Sheet[0], Color[1]); 40 }else{ 41 //black 42 card[i] = new Card(Kind[0][i], Sheet[0], Color[0]); 43 } 44 //card[i].status(); 45 } 46 // joker 47 card[4] = new Card(Kind[1][2], Sheet[1], Color[0], Color[1]); 48 //card[4].status(); 49 50 } 51 String[][] drow(int hand, int joker){ 52 x = new String[hand][2]; 53 /* 54 * joker 0 = -2 55 * joker 1 = -1 56 * joker 2 = 0 57 */ 58 switch(joker){ 59 case 0: joker = 2; break; 60 case 1: joker = 1; break; 61 case 2: joker = 0; break; 62 default: joker = 2; break; 63 } 64 for(i=0; i<hand; i++){ 65 r = (int)(Math.random()*(deck.size()-joker))+1; 66 d = deck.get(r-1); 67 if(d <= 13){ 68 x[i] = card[0].drow(); 69 deck.remove(r-1); 70 }else if(d <= (13*2)){ 71 x[i] = card[1].drow(); 72 deck.remove(r-1); 73 }else if(d <= (13*3)){ 74 x[i] = card[2].drow(); 75 deck.remove(r-1); 76 }else if(d <= (13*4)){ 77 x[i] = card[3].drow(); 78 deck.remove(r-1); 79 }else{ 80 x[i] = card[4].drow("joker"); 81 deck.remove(r-1); 82 } 83 84 /* 85 // 問題なし 86 k.print(x[i][0]); 87 k.println(x[i][1]); 88 */ 89 } 90 return x; 91 //card[4].drow("joker");// debug 92 } 93 94 95 96 void debug(){ 97 String[] y = new String[2]; 98 x = new String[2][2]; 99 100 y = card[0].drow(); 101 x[0] = y; 102 k.print(x[0][0]); 103 k.println(x[0][1]); 104 105 y = card[0].drow(); 106 x[1] = y; 107 k.print(x[1][0]); 108 k.println(x[1][1]); 109 110 k.print(x[0][0]); 111 k.println(x[0][1]); 112 113 } 114}

java

1 2package game; 3 4import java.util.ArrayList; 5 6public class Card { 7 8 Keyin k = new Keyin(); 9 Judge j = new Judge(); 10 private String kind; 11 private String[] color; 12 private int sheet; 13 14 private int r; 15 private int d; 16 private String[] x = new String[2]; 17 private String r_convert; 18 private String k_convert; 19 ArrayList<Integer> kind_deck = new ArrayList<Integer>(); 20 ArrayList<Integer> joker_deck = new ArrayList<Integer>(); 21 22 23 24 Card(String kind, int sheet, String... color){ 25 this.kind = kind; 26 this.sheet = sheet; 27 this.color = color; 28 29 reset(); 30 } 31 32 void reset(){ 33 kind_deck.clear(); 34 joker_deck.clear(); 35 36 for(int i=1; i<=13; i++){ 37 kind_deck.add(i); 38 } 39 joker_deck.add(0); 40 joker_deck.add(1); 41 } 42 43 void status(){ 44 k.println(kind); 45 k.println(sheet); 46 for(int i=0; i<color.length; i++){ 47 k.println(color[i]); 48 } 49 50 } 51 52 String[] drow(){ 53 r = (int)(Math.random()*kind_deck.size())+1; 54 d = kind_deck.get(r-1); 55 kind_deck.remove(r-1); 56 57 k_convert = j.convert(kind); 58 if(d >= 11 | d == 1){ 59 r_convert = j.convert(d); 60 k.println(k_convert+" :"+r_convert); 61 }else{ 62 k.println(k_convert+" :"+d); 63 } 64 65 x[0] = kind; 66 x[1] = ""+d; 67 return x; 68 } 69 70 String[] drow(String joker){ 71 r = (int)(Math.random()*joker_deck.size())+1; 72 d = joker_deck.get(r-1); 73 joker_deck.remove(r-1); 74 75 k_convert = j.convert(kind); 76 k.println(k_convert+" :"+color[d]); 77 78 x[0] = kind; 79 x[1] = ""+d; 80 return x; 81 } 82 83 void debug(){ 84 // joker list の要素数を取得 85 for(int i=0; i<joker_deck.size(); i++){ 86 System.out.println(joker_deck.get(i)); 87 } 88 89 } 90}
TN8001👍を押しています

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

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

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

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

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

m.ts10806

2020/04/27 09:43

どういうルールのゲームを作ろうとしているのでしょうか。 仕様をきちんとご提示ください。
tera12

2020/04/27 10:16

ポーカーを作ろうと思っています。 手札が スペード A, ダイヤ 2, クラブ 3, ハート 4, スペード 5 のときに多次元配列の中身が, x = {{"スペード", "A"}, {"ダイヤ", "2"}, {"クラブ", "3"}, {"ハート", "4"}, {"スペード", "5"}} になるようにしたいのですが{"スペード", "A"}のところが{"スペード", "5"}と表示されてしまいます。
guest

回答2

0

ベストアンサー

原因だけ端的に申しますと、class Cardprivate String[] x = new String[2];です。

Java

1String[] x = new String[2]; 2x[0] = kind; 3x[1] = "" + d; 4return x;

のように新しい配列を返す必要があります。


以下アドバイス

  • i,r,d等メンバー変数にする必要がないものが多い
    不必要に状態を持ってしまうので事故の元。
  • メンバー変数に1文字はNG
    ローカル変数と名前がかぶって事故の元。
  • メンバー変数にはできるだけprivate finalをつける
    予想外の場所で変更され事故の元。
  • ごちゃごちゃとトリッキーなことをしだしたときは要注意
    1か月後見て意味が分からなくなる。発想を変えてシンプルにならないか検討。

ご破算にするようですが^^;
折角Cardクラスがあるのに、引いた後は文字列配列になってしまうのはもったいないなと感じました。
参考コードが出せればいいのですが、こういったものはあまりやらないのでどういう作りが便利なのかよくわかりません^^;

投稿2020/04/28 10:39

TN8001

総合スコア9321

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

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

tera12

2020/05/01 00:04

新規配列を返す必要があるのを知りませんでした。 他のアドバイスも今後のプログラミングで気を付けて作成します。
guest

0

ソースは全部見てませんが、mainのforのところだけ実行しましたが普通に出力できましたので、
問題があるとすれば、多次元配列の作成を失敗しているか(j.convert?)、表示の変換に失敗しているかだと思います。

java

1String[][] x = 2{ 3 {"スペード", "A"}, 4 {"ダイヤ", "2"}, 5 {"クラブ", "3"}, 6 {"ハート", "4"}, 7 {"スペード", "5"} 8}; 9 10for(int i=0; i<x.length; i++){ 11 for(int j=0; j<x[i].length; j++){ 12 System.out.print(x[i][j]); 13 //k.print(x[i][j]); 14 } 15 System.out.println(); 16 //k.print(""); 17}

まずは配列が想定通りに作成できているかの確認。
そのあと、k.printの実装を確認してみてはどうでしょうか。

投稿2020/04/28 09:59

編集2020/04/28 10:04
momon-ga

総合スコア4820

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

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

tera12

2020/05/01 00:02

なるほど。配列が想定通りに動いているか確認せずに、他メソッドと組み合わせていました。 今後プログラム作成する際確認しながら作るようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問