CodeGym /Java Blog /ランダム /配列について
John Squirrels
レベル 41
San Francisco

配列について

ランダム グループに公開済み
やあ!これまでのトレーニングでは、単一のオブジェクト (およびプリミティブ型) を扱いました。しかし、1 つのオブジェクトだけではなく、オブジェクトのグループ全体を操作する必要がある場合はどうすればよいでしょうか? たとえば、会社の全従業員の誕生日のリストを作成するとします。これには、次のようにフォーマットされた 30 個の文字列が含まれている必要があります: 「Sarah Huffman、1 月 25 日」配列 と呼ばれる特別なデータ構造の恩恵を受けます。配列を実際のオブジェクトと比較すると、それは貸金庫のある銀行の金庫によく似ています。 配列について - 1配列も「ボックス」で構成されます。各ボックスには何か(要素)を入れることができます。要素にアクセスするには、そのボックス番号 (インデックス) を知る必要があります。配列は次のように作成されます。

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
ここでは、10 個の要素を保持する配列を作成します。 配列のいくつかの特徴にすぐに気づくことができます。
  1. 明確に定義されたデータ型の要素を格納します。String 配列を作成した場合、その中に他のものを格納することはできません。データ型は配列の作成時に指定されます。ここが貸金庫(顧客が欲しいものを預けることができる)とは異なります。

  2. 配列の作成時にそのサイズを指定する必要があります。配列の作成後に後で指定したり、サイズを変更したりすることはできません。
配列を作成しているという事実は、式の両側の角括弧によって示されます。参照変数名の前後に指定できます。どちらの方法でも機能します:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
配列に何かを書き込みたい場合は、値が書き込まれるボックスのインデックスを指定する必要があります。配列内のボックスには 0 から始まる番号が付けられます。 ゼロから数えることは、プログラミングにおいて非常に一般的な方法です。早く慣れるほど良いです :)つまり、 最初のボックス配列について - 2に値を入れたい場合は、次のようにします。

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
これで、Jana の誕生日が従業員の誕生日の配列の最初のセルに保存されました。同様の方法で他の値を追加できます。

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
ロージーの誕生日を 8 番目のボックスに追加したことに注意してください(ボックス No. 7 が 8 番目のボックスである理由を忘れていませんよね?)。他のすべてのセルが埋められていないことがわかります。配列に値を順番に書き込む必要はありません。そのような要求はありません。もちろん、要素を順番に書くと、空いているボックスの数と占有されているボックスの数を追跡するのがはるかに簡単になり、配列に「穴」ができるのを防ぎます。いずれかのボックスの中身を取得したい場合は、(貸金庫と同様に) その番号を知る必要があります。やり方は次のとおりです。

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
コンソール出力: Rosie Mills、1 月 3 日変数 を作成しString、コンパイラーに「誕生日配列でインデックス 7 のボックスを見つけ、そこに含まれる値をString変数rosieBirthdayに割り当てます」と指示しました。そしてそれはまさにその通りでした。配列を操作する場合、特別なプロパティlengthを使用して配列の長さを簡単に見つけることができます。

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, 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] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, 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 ここで、配列がメモリにどのように格納されるかについて少し説明します。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("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
ここでいくつかのことを理解する必要があります。
  1. プリミティブの場合、配列には特定の値のセット (例: ints) が格納されます。オブジェクトの場合、配列には参照のセットが格納されます。
    配列catsは 3 つの要素で構成され、それぞれがオブジェクトへの参照Catです。各参照は、対応するオブジェクトが格納されているメモリ アドレスを指します。

  2. 配列要素はメモリ内の 1 つのブロックに配置されます。これは、それらに迅速かつ効率的にアクセスできるようにするために行われます。
したがって、catsすべてのオブジェクト (配列要素) が格納されているメモリのブロックを参照します。Cats[0]このブロック内の特定のアドレスを参照します。 配列について - 3 配列はオブジェクトを格納するだけではなく、オブジェクトそのものであることを理解することが重要です。このため、文字列や数値の配列だけでなく、配列の配列 も作成できるかどうかという疑問が生じます。答えは「はい、できます!」です。配列には、他の配列を含む任意のオブジェクトを格納できます。このような配列は2 次元と呼ばれます。これを視覚的に表現すると、通常のテーブルと非常によく似たものになります。それぞれ 10 を格納できる3 つの配列からなる配列を作成するとしますint。次のようになります。
配列について - 4
各行は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("Fluffy");
}
[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] (最初の配列、最初の要素) が最初に表示され、次にcat[0][1] (最初の配列、2 番目の要素) が表示されます。最初の配列を調べた後、cat[1][0]cat[1][1]cat[1][2]などが表示されます。 ちなみに、2 次元配列もサポートされています省略形の初期化:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
通常、2 次元配列をnumbersとして宣言しますint[3][3]が、この省略表現を使用すると、値をすぐに指定できます。なぜ 2 次元配列が必要なのでしょうか? これを使用すると、有名な「Battleship」ゲームを簡単に再現できます。 配列について - 5 「Battleship」では、競技場の構造を簡単に記述できます。つまり、それぞれ 10 個の要素を持つ 10 個の配列の 2 次元配列です。これらの配列を 2 つ作成します (1 つは自分用、もう 1 つは対戦相手用)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
いくつかの値 (数字や記号など) を使用して、船の位置に対応する要素を入力し、特定の要素の座標を順番に呼び出します。
  • 戦艦ボード1[0][2]!
  • 逃す!戦艦ボード2[2][4]!
  • 打つ!
  • 戦艦ボード2[2][5]!
  • 打つ!
  • 戦艦ボード2[2][6]!、
  • 沈んだ!
これで配列の最初の紹介は終わりましたが、これは配列との対話の始まりにすぎません。次のレッスンでは、それらの興味深い使用方法を確認し、このデータ構造をより便利に操作できるようにする Java の組み込み関数についても学びます :)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION