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

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

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

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

Q&A

解決済

5回答

21080閲覧

可変長x可変長の二次元配列

token_regain

総合スコア25

Java

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

0グッド

0クリップ

投稿2015/07/17 11:18

Javaで可変長x可変長の二次元配列を作成したいと思っています。
動的にメモリを取得する為にはArrayListを使うのかなと思いましたが
二次元配列は動的に取れなさそうで困っています。

どのようにするのがよいのでしょうか。

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

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

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

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

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

guest

回答5

0

(題意を配列サイズが実行時にきまる多次元配列の作り方と解釈しています)

Java言語の配列型はもともと動的に長さが決まります。というより、コンパイル時にサイズが確定する配列型は存在しません。

java

1int M, N; 2// 実行時にM,Nが決まると仮定... 3 4// 2次元配列を確保 5int[][] array = new int[M][N]; 6 7// 各要素にアクセス 8for (int i = 0; i < M; ++i) { 9 for (int j = 0; j < N; ++j) { 10 array[i][j] = (N * i) + j; 11 } 12}

投稿2015/07/17 12:58

編集2015/07/17 13:01
yohhoy

総合スコア6191

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

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

0

ArrayList<ArrayList<Integer>>のような使い方はどうですか?

投稿2015/07/17 11:22

hello-world

総合スコア1342

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

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

0

ベストアンサー

以下のようにArrayListの二次元配列を作成可能です

java

1import java.util.ArrayList; 2 3 4class ES{ 5 6 7public static void main(String[] args){ 8 9 10ArrayList<ArrayList<Integer>> bounce=new ArrayList<>(); 11 12 13for(int a=0;a<3;a++){ 14 15ArrayList<Integer> dd=new ArrayList<>(); 16 17dd.add(a); 18 19bounce.add(dd); 20 21 22 23} 24 25 26 27 28} 29 30 31}

投稿2016/10/31 21:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

メモリというか、配列の要素数(サイズ)の話ですかね?

配列のサイズを動的に変えるのは面倒なんで、2次元配列ぐらいまでなら
List<List<String>>を使ったほうが楽ですね。

どうしても配列として使いたいなら、要素の追加・削除はListかkatoyさんの回答の様に
Mapを使ってやって、そのあとに配列に変換するといいですよ。

java

1 List<List<Integer>> fooList = new ArrayList<>(); 2 3 // 要素の追加削除処理 4 5 // 変換処理(なんかもっといい実装方法ありそうだけど…) 6 int x = fooList.size(); 7 int y = 0; 8 for (List<Integer> i : fooList) { 9 if (y < i.size()) { 10 y = i.size(); 11 } 12 } 13 Integer[][] foos = new Integer[x][y]; 14 for (int i = 0; i < x; i++) { 15 for (int j = 0; j < y; j++) { 16 try { 17 foos[i][j] = fooList.get(i).get(j); 18 } catch (IndexOutOfBoundsException e) { 19 foos[i][j] = null; 20 } 21 } 22 }

投稿2015/07/21 09:49

MakotoMiyazaki

総合スコア297

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

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

0

HashMap<Integer, HashMap<Integer, String>> とすると、 array.get(i),get(j) として2次元配列風にアクセスすることはできます。

java

1import java.util.HashMap; 2 3public class Dim2 { 4 5 public static void main(String[] args) { 6 HashMap<Integer, HashMap<Integer, String>> dim2 = new HashMap<>(); 7 8 // dim2 に値を設定する。 9 HashMap<Integer, String> vec1 = new HashMap<>(); 10 vec1.put(0, "01-00"); 11 vec1.put(2, "01-01"); 12 dim2.put(1, vec1); 13 14 HashMap<Integer, String> vec3 = new HashMap<>(); 15 vec3.put(0, "03-00"); 16 vec3.put(1, "03-01"); 17 dim2.put(3, vec3); 18 19 // dim2 の内容を表示する。 20 for (int i = 0; i < 4; i++) { 21 for (int j = 0; j < 4; j++) { 22 System.out.print(get_val(dim2, i, j) + ",\t"); 23 } 24 System.out.println(); 25 } 26 } 27 private static String get_val(HashMap<Integer, HashMap<Integer, String>> dim2, int i, int j) { 28 if (dim2.get(i) == null) { 29 return null; 30 } 31 return dim2.get(i).get(j); 32 } 33}

実行結果

null, null, null, null, 01-00, null, 01-01, null, null, null, null, null, 03-00, 03-01, null, null,

投稿2015/07/17 23:31

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問