目次
Javaの2次元(多次元)配列とは?
この記事では、Javaの2次元配列について解説します。
2次元配列は、1次元配列に縦の並びを加えた配列です。
そして、2次元配列の配列を多次元配列と言います。
配列については、以下の記事で詳しく説明しています。
【関連記事】
▶︎【Java入門】配列と初期化について
2次元配列を宣言する
2次元配列を使うには、まず宣言する必要があります。
宣言方法は、次のように記述できます。
型名 [][] 配列変数名; 配列変数名 = new 型名[ 行数 ][ 列数 ];
もしくは、1文で記述してもOKです。
型名 [][] 配列変数名 = new 型名[ 行数 ][ 列数 ];
2次元配列を宣言するときは、「[ ]」(ブラケット)記号を2つ並べます。
これによって、行と列の2つの要素数を指定可能です。
要素数は必ずしも同じ必要はないので、例えば「行は2」「列は3」といったように書けます。
2次元配列を初期化する
2次元配列を初期化するには、次のように記述します。
型名 [][] 配列変数名 = { {値1-1, 値1-2, ..}, {値2-1, 値2-2, ..} };
値全体を「{}」(中括弧)で括ります。
その中でさらに「{}」で括り、1行目、2行目…と値を格納していきます。
「値1-1」が「1行目の1列目」、「値1-2」が「1行目の2列目」といった形です。
また、次のように初期化してもOKです。
配列変数名[0][0] = 値1-1; 配列変数名[0][1] = 値1-2; 配列変数名[1][0] = 値2-1; 配列変数名[1][1] = 値2-2;
2次元配列に追加して表示
では、実際にプログラムを動かして確認してみましょう。
次のように、scoresという2次元配列に値を1つずつ追加してみます。
■記述例 public class Main { public static void main(String args[]){ // 2次元配列の初期化 int[][] scores = new int[3][2]; // 2次元配列に値を追加 scores[0][0] = 67; scores[0][1] = 90; scores[1][0] = 74; scores[1][1] = 81; scores[2][0] = 69; scores[2][1] = 55; // 値を出力 System.out.println("1人目の国語の成績:" + scores[0][0] + " 数学の成績:" + scores[0][1]); System.out.println("2人目の国語の成績:" + scores[1][0] + " 数学の成績:" + scores[1][1]); System.out.println("3人目の国語の成績:" + scores[2][0] + " 数学の成績:" + scores[2][1]); } }
■実行結果 mbp:Desktop potepan$ java Main 1人目の国語の成績:67 数学の成績:90 2人目の国語の成績:74 数学の成績:81 3人目の国語の成績:69 数学の成績:55
それぞれ、追加した値が出力されました。
また、2次元配列の初期化と追加を同時に行う方法もあります。
今回は、for文も使って出力方法を変えてみました。
■記述例 public class Main { public static void main(String args[]){ // 2次元配列の初期化と値の追加 int[][] scores = { {67, 90}, {74, 81}, {69, 55} }; // 値を出力 for (int i = 0; i < 3; i++) { System.out.println(i+1 + "人目の成績"); for (int j = 0; j < 2; j++) { if (j == 0) { System.out.println("国語の成績:" + scores[i][j]); } else { System.out.println("数学の成績:" + scores[i][j]); } } System.out.println(); } } }
■実行結果 mbp:Desktop potepan$ java Main 1人目の成績 国語の成績:67 数学の成績:90 2人目の成績 国語の成績:74 数学の成績:81 3人目の成績 国語の成績:69 数学の成績:55
どちらの追加方法でも問題なく行えますので、お好みのやり方を試してみてください。
2次元配列の要素数を取得するには?
要素数を取得するにはどうすればいいですか?
要素数(長さ)を取得するには、lengthメソッドを使いましょう!
使い方は簡単で、要素数を取得したい配列に「.length」を追記する形で使います。
実際に、プログラムを動かして確認してみます。
■記述例 public class Main { public static void main(String args[]){ int[][] scores = { {67, 90}, {74, 81}, {69, 55} }; System.out.println("配列の要素数は " + scores.length + " です。"); } }
■実行結果 mbp:Desktop potepan$ java Main 配列の要素数は 3 です。
より詳しい内容は、次の記事をチェックしてみてください。
【関連記事】
▶︎【Java基礎】サッと理解!文字列・配列の長さをlengthで取得する(よく使うサンプルコード付き)
2次元配列をソートする
2次元配列をソートするには、自作でComparableインターフェースを実装することで実現できます。
記述例は次の通りです。
■記述例 import java.util.Arrays; import java.util.Comparator; public class Main { public static void main(String args[]){ int[][] scores = {{67, 90}, {74, 81}, {69, 55}, {67, 78}, {80, 56}}; Sort[] sort = new Sort[5]; for (int i = 0; i < 5; i++) { sort[i] = new Sort(scores[i][0], scores[i][1]); } Arrays.sort(sort); System.out.println("---国語の成績でソートします---"); for (int i = 0; i < 4; i++) { System.out.printf("国語の成績:%d 数学の成績:%d\n", sort[i].first, sort[i].second); } } // Comparableインターフェースを実装する public static class Sort implements Comparable<Sort> { int first, second; public Sort(int first, int second) { this.first = first; this.second = second; } public int compareTo(Sort num) { //第一要素の値が同じ場合に、第二要素で昇順にソートする処理 if (this.first == num.first) { return this.second - num.second; } else { return this.first - num.first; } } } }
ソートを行うために、Arrayクラスのsortメソッドを使用しました。
上記のプログラムを実行すると、次の結果を取得できます。
■実行結果 mbp:Desktop potepan$ java Main ---国語の成績でソートします--- 国語の成績:67 数学の成績:78 国語の成績:67 数学の成績:90 国語の成績:69 数学の成績:55 国語の成績:74 数学の成績:81
国語の成績を基準に、意図した処理でソートできているのがわかります。
ソートについては以下の記事でも解説していますので、あわせて確認してみてください。
【関連記事】
▶︎【Java】listの要素を並び替える ソート処理の方法について解説
2次元配列で検索する
ここでは、2次元配列で値を検索する方法を紹介します。
配列を検索するには、ArrayクラスのbinarySearchメソッドを使いましょう。
binarySearchメソッドは、ソートされた配列内の要素を検索するメソッドです。
では、サンプルを元に動きを確認してみます。
■記述例 import java.util.Arrays; public class Main { public static void main(String args[]){ int[][] scores = {{67, 90}, {74, 81}, {69, 55}, {76, 78}, {80, 56}}; final int SEARCH_NUMBER = 69; int index = 0; int row = -1; for(int i = 0; i < scores.length; i++) { if(scores[i][0] <= scores[i][1]) { Arrays.sort(scores[i]); index = Arrays.binarySearch(scores[i], SEARCH_NUMBER); } else { Arrays.sort(scores[i]); index = Arrays.binarySearch(scores[i], SEARCH_NUMBER); if(index == 0) { index = 1; } else if(index == 1) { index = 0; } else { // } } if(index >= 0) { row = i; break; } } if(index >= 0) { System.out.println(String.format("Hit! scores[%s][%s]=%s", row, index, SEARCH_NUMBER)); } else { System.out.println(String.format("scores[][]に%sは存在しません", SEARCH_NUMBER)); } } }
for文の中で、binarySearchメソッドを用いて検索処理をしています。
出力の際に、元の配列の並びを再現するために、if文で条件を変えています。
上記のプログラムを実行することで、SEARCH_NUMBERで指定した値が出現する、一番最初の配列を出力します。
■実行結果 mbp:Desktop potepan$ java Main Hit! scores[2][0]=69
取得できる要素数は列数と等しくなります。