Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの配列(Array)入門:初心者向けやさしい解説ガイド

1つの変数に複数の値を格納できたら便利だと思いませんか?実は、それを可能にする仕組みがJavaには備わっています。それが「配列(Array)」です。配列を使えば、複数の値を1つの変数にまとめて保存できるため、コードをすっきりと整理された状態に保つことができます。

このガイドでは、配列の仕組み、配列が活用される理由、そして配列の中身を操作する方法について解説します。具体的なコード例も交えながら、順を追って見ていきましょう。

配列とは?

配列は「リスト」とも呼ばれ、順序付けられた要素の並びを格納するデータ構造です。配列には0個以上の項目を保存できますが、すべて同じデータ型である必要があります。たとえば、100個の文字列や52個の数値を1つの配列に格納することが可能です。

配列が便利なのは、似た性質の値をひとまとめにグループ化できるからです。例えば、コーヒーの種類のリストを作りたいとしましょう。それぞれのコーヒーの種類を個別の変数として宣言する代わりに、配列を使ってまとめて管理できます。

さらに、配列を宣言した後は、ループ処理によって配列内のすべての値に対して同じメソッドや操作を一括で実行することもできます。

配列は「値のコレクション」と考えるとイメージしやすいでしょう。今日やるべきタスクを書き出したTo Doリストを思い浮かべてください。あれと同じように、配列も順序立てて項目が並んだリストなのです。

配列の宣言

Javaで配列を宣言するのは非常に簡単です。配列の名前を決めて、データ型を指定するだけです。以下は、coffeesという名前の配列を宣言する例です。

String[] coffees;

このコードは、coffeesという配列を作成します。左側には配列に格納するデータ型を記述し、その後に空の角括弧 [ ] を続けます。この角括弧があることで、「単なる文字列変数ではなく配列を定義したいのだ」とJavaに伝えることができます。右側には変数名を書きます。

しかし、これだけでは作業は終わりではありません。配列を宣言するときは、配列にいくつの要素を格納したいのかをプログラムに教える必要があります。これにより、Javaは値を保存するために必要なメモリを適切に確保できるのです。

ここでは、coffees配列にお店のお気に入りのブレンド3種類を保存したいとします。その場合、配列が保持できる要素数として「3」を指定します。

coffees = new String[3];

これにより、後から値を代入できる3つの空きスロットが作成されます。

配列にどれだけの値を格納したいのかは、事前にしっかり検討しておきましょう。重要な注意点として、一度配列のサイズを決めたら、後から変更することはできません。

なお、宣言とメモリ確保は、次のように1行にまとめて書くこともできます。

String[] coffees = new String[3];

これが最も簡潔でおすすめの書き方です。この方法が使えないのは、格納する値の数がまだ分からない場合のみです。そのようなときは、まず配列を宣言しておき、プログラムが必要な要素数を把握した段階でメモリを確保するとよいでしょう。

この例では文字列型(String)の配列を作りましたが、整数型(int)の配列、オブジェクトの配列、配列の配列(多次元配列)、あるいはその他の任意のデータ型の配列も同様に宣言できます。

配列の初期化

配列のセットアップはまだ完了していません。ここまでで宣言したのは、中身が空っぽの標準的な配列です。変数の宣言と同時に初期値を代入したい場合は、次のような構文を使用します。

String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };

この例では、波括弧 { } を使って配列に3つの値を代入しています。

配列の要素へのアクセス

配列の魅力は、要素へのアクセスが簡単なことです。例えるなら、To Doリストの中で今集中したい項目に印をつけるような感覚です。

配列の中では、すべての項目に固有の番号が割り当てられています。これを「インデックス番号」と呼びます。インデックス番号は0から始まり、配列内の項目ごとに1ずつ増えていきます。先ほどのリストを見てみましょう。

  • 0:Rwanda Izuba
  • 1:French Roast
  • 2:Vietnam Da Lat Arabica

このリストでは、「Rwanda Izuba」のインデックスは0、「French Roast」は1、「Vietnam Da Lat Arabica」は2となります。次の配列を例に考えてみます。

String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };

この配列の最初の要素にアクセスしたい場合は、次のコードを使います。

System.out.println(coffees[0]);

このコードは次の値を出力します。

Rwanda Izuba

インデックス番号は、角括弧 [ ] の中に指定して渡します。有効なインデックス番号の範囲は0から「配列の長さマイナス1」までです。前述のとおり、配列は0から始まるインデックスで管理されているためです。

存在しないインデックス番号にアクセスしようとすると、エラーが発生します。

ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

このケースでは、配列のインデックス3にアクセスしようとしました。しかし、インデックス番号は2までしかありません(配列は0から始まることを忘れないでください)。そのため、エラーが返されました。

次はもう一歩進んでみましょう。配列内のすべての項目を順番に取り出して、それぞれに何らかの操作を行いたい場合はどうすればよいのでしょうか。ここでは、配列内の全項目をコンソールに出力してみます。これにはfor-eachループが便利です。

class CoffeeArray {
    public static void main(String[] args) {
        String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };
        for (String coffee : coffees) {
            System.out.println(coffee);
        }
    }
}

このコードの出力結果は次のとおりです。

Rwanda Izuba
French Roast
Vietnam Da Lat Arabica

この例では、coffees配列内のすべての項目を順に処理し、各項目をコンソールに出力しています。通常のforループではなくfor-eachループを採用したのは、カウンター変数が不要で、より簡潔で読みやすいコードになるからです。

配列の要素を変更する

さて、ここでちょっとした問題が発生しました。実は、お気に入りのフランス産ブレンドは「French Roast」ではなく「French Classic」という名前だったのです。この値を修正するには、インデックスを利用します。

次のコードをご覧ください。

class CoffeeArray {
    public static void main(String[] args) {
        String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };
        coffees[1] = "French Classic";
        System.out.println(coffees[1]);
    }
}

代入演算子(=)を使って、インデックス位置1にあるコーヒーの値を変更しました。French RoastからFrench Classicへ書き換えたのです。このコードは次の値を出力します。

French Classic

Java配列の実践例

それでは、これまで学んできた概念をすべて盛り込んだ実践例に挑戦してみましょう。ここでは、先週1週間にコーヒーに使った金額の合計を計算するプログラムを作成します。

まず、クラスとプログラムで使用する変数を用意します。

class CoffeePrices {
    public static void main(String[] args) {
        Double[] purchases = {2.55, 2.75, 2.99, 3.05};
        double sum = 0;
    }
}

2つの変数を宣言しました。1つ目はコーヒーの購入金額リストを格納する配列、2つ目は支出の合計を記録するカウンター用の変数です。次に、for-eachループを使って、すべての購入金額を順に取り出し、sum変数に加算していきます。

for (double purchase : purchases) {
    sum += purchase;
}
System.out.println("You've spent $" + sum + " on coffee in the last week.");

すべてのコードを合わせて実行すると、次の結果が出力されます。

You've spent $11.34 on coffee in the last week.

1週間で11.34ドル。悪くないですね!とても実用的なプログラムです。

まとめ(と挑戦課題)

配列とは、同じデータ型の複数の値を格納できるデータ構造です。好きな本のリスト、ゲーム内のプレイヤーのリスト、平均値を計算したい数値のリストなど、どんなものでも配列として表現できます。

最後に、理解度を試すための挑戦課題を紹介します。

ユーザーに旅行先を選ばせ、その詳細情報を表示するプログラムを書いてみましょう。旅行先の一覧は1つの配列に格納してください。さらに、各目的地について1文ずつの説明文を、別の配列に格納します。

ユーザーが旅行先を選択したら、その目的地が配列内のどこにあるかを検索し、インデックス番号を求めます。そして、そのインデックス番号を利用して、対応する目的地の説明文をコンソールに出力してください。

これであなたも、プロフェッショナルのようにJavaの配列を使いこなす準備が整いました!

  1. Javaで学ぶコムソート(Comb Sort)の実装方法とサンプルコード

    コムソートとはコムソート(Comb Sort)は、バブルソートを改良したソートアルゴリズムです。リストの後方に残りやすい小さな値(通称「ウミガメ」と呼ばれる要素)を効率的に手前に移動させ、転倒(順序が逆になっているペア)を一つずつ解消していきます。バブルソートとの最大の違いは、隣接する要素だけでなく、一定の間隔(ギャップ)を空けた要素同士を比較する点です。このギャップを毎回約1.3倍の比率で縮小していくことで、ソートの効率が大幅に向上します。Javaによる実装例それでは、実際のコードを見てみましょう。import java.util.Arrays; public class Demo{

  2. Javaの配列におけるデフォルト値とは?各データ型の初期値をサンプルコード付きで解説

    Javaには、同じ型の要素を固定サイズで連続的に格納できるデータ構造「配列(array)」が用意されています。配列は複数のデータをまとめて管理するために使われますが、実質的には「同じ型の変数を集めたもの」と考えると理解しやすくなります。 ここで重要なのが、配列を生成した際に要素を明示的に初期化しなくても、JVMが自動的にデフォルト値を割り当ててくれるという仕様です。そのため、newで配列を作成した直後でも、未初期化の状態のまま安全に各要素へアクセスできます。 データ型ごとのデフォルト値一覧 主なデータ型のデフォルト値は以下の通りです。 boolean … false byte / shor