こんにちは!以前は、トレーニング中に単一のオブジェクト (またはプリミティブ型) を操作していました。しかし、1 つのオブジェクトではなくグループ全体を操作する必要がある場合はどうすればよいでしょうか? たとえば、社内の全従業員の誕生日のリストを作成したいとします。たとえば、「アンドレイ ペトロフ、1 月 25 日」という形式で 30 行を含める必要があります。ここでは特別なデータ構造である配列が役に立ちます。この配列を現実世界のオブジェクトと比較すると、その構造はセルを含む銀行の金庫に非常によく似ています。 配列もセルで構成されています。各セルには何かを入れることができます。この場合、コンテンツにアクセスするにはセル番号を知る必要があります。配列は次のように作成されます。
public class Main {
public static void main(String[] args) {
String [] birthdays = new String[10]; // array of Java strings
}
}
ここでは 10 個のセルの配列を作成しました。 配列のいくつかの機能にすぐに注目できます。
- 厳密に定義されたタイプのデータを保存します。最初に文字列配列を作成した場合
String
、そこには他に何も格納できません。データ型は配列の作成時に指定します。これが、顧客が望むものを何でも保管できる貸金庫と異なる点です。 - 配列には、プリミティブ型 (たとえば、
int
)、文字列 (String
)、または同じクラスのオブジェクトのデータを格納できます。より正確には、オブジェクト自体ではなく、これらのオブジェクトへのリンクです。 - 配列のサイズは作成時に指定する必要があります。後で指定したり、作成後にサイズを変更したりすることはできません。
[]
Java では、式の両側に角かっこを使用して配列が作成されていることを示します。これらは参照変数の名前の前または後に指定できます。どちらの方法でも機能します。
//Java arrays of strings, two syntaxes
String [] birthdays = new String[10];
String birthdays [] = new String[10];
配列に何かを書き込みたい場合は、値を書き込むセルの番号を指定する必要があります。配列のセル番号は 0 から始まります。プログラミングでは 0 から始めるのが一般的です。早く慣れるほど良いです:) つまり、配列の最初のセルに値を入れたい場合は、次のように行います。
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
}
}
ここで、同僚の誕生日を含む配列の最初のセルには、Lena の誕生日を含む文字列が含まれています。同様に、他の値を追加することもできます。
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
}
}
注意してください: オレシャの誕生日を 8 番目のセルに追加しました (なぜ 7 番目のセルが 8 番目なのか忘れましたか?)。他のすべてのセルは入力されていませんが。配列に値を順番に書き込む必要はありません。そのような制限はありません。一方、順番に書き込むと、空きセルと占有セルの数を追跡するのがはるかに簡単になり、配列に「穴」が残らなくなります。銀行セルの場合のように、配列セルの内容を取得したい場合は、その番号を知る必要があります。これは次のように行われます。
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
String olesyaBirthday = birthdays[7];
System.out.println(olesyaBirthday);
}
}
コンソール出力:
Олеся Остапенко, 3 января
変数を作成しString
、コンパイラーに「配列内でインデックス 7 のセルを見つけてbirthdays
、そこに格納されている値を変数に代入してくださいString
olesyaBirthday
」と指示しました。まさにそれが彼がやったことだ。
Java配列の長さ
配列を操作する場合、特別なプロパティ - を使用してその長さを簡単に確認できますlength
。
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
int birthdaysLength = birthdays.length;
System.out.println(birthdaysLength);
}
}
コンソール出力:
10
注記:このプロパティには、length
入力されたセルの数ではなく、配列のサイズが保存されます。私たちの配列には 3 つの値しか格納されませんが、作成時にサイズ = 10 を指定しました。これがフィールドが返す値ですlength
。なぜこれが役立つのでしょうか? たとえば、すべての誕生日のリストをコンソールに出力したい場合 (忘れられている人がいないことを確認するため)、これを 1 つの単純なループで実行できます。
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[2] = "Vika Ignatova, July 12";
birthdays[3] = "Denis Kozlov, September 7";
birthdays[4] = "Maxim Maslennikov, November 9";
birthdays[5] = "Roman Baranov, August 14";
birthdays[6] = "Valery Pyatkina, April 1";
birthdays[7] = "Olesya Ostapenko, January 3";
birthdays[8] = "Kostya Gurko, October 19";
birthdays[9] = "Seryozha Naumov, May 3";
for (int i = 0; i < birthdays.length; i++) {
System.out.println(birthdays[i]);
}
}
}
i
ループ内で、最初はゼロに等しい 変数を作成します。各パスで、配列からインデックス i のセルを取得し、その値をコンソールに出力します。ループは 10 回反復され、配列のセルのインデックスに従って i の値が 0 から 9 に増加します。birthdays[0]
このようにして、から までのすべての値をコンソールに出力しますbirthdays[9]
. 実際、配列を別の方法で作成する方法もあります。たとえば、数値の配列はint
次のように作成できます。
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
}
}
この方法を「高速初期化」と呼びます。すぐに配列を作成して値を入力できるので、非常に便利です。配列のサイズを明示的に指定する必要はありません。フィールドはクイックlength
初期化中に自動的に入力されます。
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
System.out.println(numbers.length);
}
}
コンソール出力:
9
Java オブジェクト配列
オブジェクトの配列とプリミティブの配列はメモリに異なる方法で格納されることはすでに聞いたでしょう。たとえば、3 つのオブジェクトの配列を考えてみましょうCat
。
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat[] cats = new Cat[3];
cats[0] = new Cat("Thomas");
cats[1] = new Cat("Hippopotamus");
cats[2] = new Cat("Philip Markovich");
}
}
ここで理解すべきことがいくつかあります。
- プリミティブの場合、Java 配列には多くの特定の値 (数値など
int
) が格納されます。オブジェクトの場合、配列には多くの参照が格納されます。配列はcats
3 つのセルで構成され、各セルにはオブジェクトへの参照が含まれますCat
。各リンクは、そのオブジェクトが保存されているメモリ内のアドレスを指します。 - 配列要素は単一のブロック内のメモリに格納されます。これは、より効率的かつ迅速にアクセスするために行われます。したがって、リンクは、
cats
すべてのオブジェクト (配列の要素) が格納されているメモリ内のブロックを指します。Acats[0]
- このブロック内の特定のアドレスへ。
配列の配列または 2 次元配列
これに基づいて、私たちは疑問に直面します。たとえば、文字列や数値の配列ではなく、配列の配列を作成できるでしょうか? 答えは「はい、できます!」です。配列には、他の配列を含む任意のオブジェクトを格納できます。このような配列を二次元と呼びます。画像で表現すると、通常のテーブルと非常によく似ています。たとえば、それぞれ 10 個のセルを持つ数値の配列を 3 つ保存する配列を作成したいとしますint
。次のようになります。 各行は数値の配列を表しますint
。最初の配列には 1 から 10 までの数値が含まれ、2 番目の配列には -1 から -10 までの数値が含まれ、3 番目の配列には一連の乱数が含まれます。これらの配列はそれぞれ、2 次元配列のセルに格納されます。コードでの 2 次元配列の初期化は次のようになります。
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
}
2 次元の cat 配列には、それぞれ 5 つのセルからなる 3 つの配列が保存されます。オブジェクトを 2 番目の配列の 3 番目のセルに配置したい場合は、次のようにします。
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
cats[1][2] = new Cat("Fluff");
}
[1]
2 番目の配列を指し、[2]
この配列の 3 番目のセルを指します。2 次元配列は複数の配列で構成されているため、それを走査してすべての値をコンソールに出力する (またはすべてのセルを埋める) には、二重のネストされたループが必要です。
for (int i = 0; i < cats.length; i++) {
for (int j = 0; j < cats[i].length; j++) {
System.out.println(cats[i][j]);
}
}
外側のループ (variable i
) では、2 次元配列を構成するすべての配列を順番に走査します。内側のループ (変数j
) では、各配列のすべてのセルを反復処理します。その結果、オブジェクトcats[0][0]
(最初の配列、最初のセル) がコンソールに最初に表示され、2 番目のオブジェクトはcats[0][1]
(最初の配列、2 番目のセル) になります。最初の配列がなくなると、、、cats[1][0]
などcats[1][1]
がcats[1][2]
出力されます。ちなみに、高速初期化は 2 次元配列にも利用できます。
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
numbers
通常はのように 二次元配列を記述しますint[3][3]
が、この方法を使うとすぐに値を指定することができます。なぜ 2 次元配列が必要なのでしょうか? たとえば、このツールを使用すると、有名なゲーム「バトルシップ」を簡単に再現できます。 「バトルシップ」のプレイ フィールドの構造は簡単に説明できます。10 個の配列、それぞれ 10 個のセルからなる 2 次元配列です。 。自分自身と対戦相手用に、そのような配列を 2 つ作成します。
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
*
あなたの船が位置するセルに いくつかの値 (数字や記号など) を入力し、あなたと対戦相手が順番にそのセル番号を呼び出します。
- 海の戦い[6][5]!
- 過去!seaBattle2[6][6]!
- 怪我した!
- seaBattle2[6][7]!
- 怪我した!
- 海バトル2[6][8]!、
- 殺された!
配列に関する追加リソース
配列についてもっと知りたいですか? ぜひ以下の記事もご覧ください。このトピックに関しては、興味深く役立つ情報がたくさんあります。- Java の配列- 配列、その作成、初期化、および使用に関する詳細な記事。例付き。
- Arrays クラスとその使用法 - この記事では、クラスのいくつかのメソッドについて説明します。
Array
- 「配列」は、配列に特化した最初の JavaRush 講義です。
- 多次元配列- 例を含む多次元配列に関する詳細な記事。
- null ではなく長さ 0 の配列を返す - 『Effective Programming』の著者である Joshua Bloch が、空の配列をより適切に返す方法について語ります。
GO TO FULL VERSION