Java入門|配列の応用(拡張for文とソート)

配列操作が一気にレベルアップ!拡張for文とソートでスマートに処理する

これまで、配列とfor文を使ってデータを順番に処理する方法を学んできましたね。ここからはさらに一歩進んで、もっと簡単に配列を扱う方法と、配列の中身を並び替える方法を見ていきます。

配列の処理は、書き方を少し工夫するだけで、ぐっと読みやすく、ミスの少ないコードになります。特に「拡張for文」は、添字を意識せずに配列を扱える便利な書き方です。また、「ソート」は実務でもよく使われる重要な処理です。

この章では、配列をより自然に扱うためのテクニックとして、拡張for文とソートの仕組みを、やさしく丁寧に解説していきます。

拡張for文で配列をシンプルに扱う

これまでのfor文では、次のように添字を使って配列を処理していました。

for(int i = 0; i < data.length; i++){
    System.out.println(data[i]);
}

この書き方はとても基本ですが、「添字」を意識する必要があります。

そこで登場するのが、拡張for文です。

for(型 変数名 : 配列名){
    処理
}

この書き方では、配列の要素を1つずつ取り出して、指定した変数に入れて処理できます。

拡張for文の動きを理解しよう

たとえば、次の配列があるとします。

int[] data = {10, 20, 30};

これを拡張for文で処理すると、

for(int value : data){
    System.out.println(value);
}

内部では、次のような流れになります。

繰り返し回数value に入る値
1回目10
2回目20
3回目30

つまり、添字を使わなくても、順番に値を取り出せるのです。

拡張for文を使ったシンプルなプログラム

では、実際のプログラムで確認してみましょう。
ここでは、1週間の運動時間を表示する例にします。

ファイル名:Sample9.java

class Sample9
{
    public static void main(String[] args)
    {
        int[] exercise = {30, 45, 20, 60, 40};

        for(int time : exercise){   // 拡張for文で配列を処理
            System.out.println("今日の運動時間は " +
                               time + " 分です。");
        }
    }
}

実行結果

今日の運動時間は 30 分です。
今日の運動時間は 45 分です。
今日の運動時間は 20 分です。
今日の運動時間は 60 分です。
今日の運動時間は 40 分です。

このように、添字をまったく使わずに配列の中身を処理できます。

拡張for文のメリットと注意点

拡張for文の特徴を整理しておきましょう。

メリット内容
コードが短くなる添字が不要
読みやすい配列の中身に集中できる
ミスが減る範囲外アクセスを防ぎやすい

ただし、注意点もあります。

注意点内容
添字が使えない何番目かはわからない
値の書き換えに不向き要素の位置指定ができない

そのため、

  • 値を順番に処理したい → 拡張for文
  • 添字を使いたい → 通常のfor文

という使い分けが大切です。

配列の中身を並べ替える(ソート)

次に、配列の応用として「ソート」を見ていきましょう。

ソートとは、データを一定のルールで並び替えることです。

たとえば、

22, 80, 57, 60, 50

というデータを、大きい順に並べると、

80, 60, 57, 50, 22

になります。

このように順番を整える処理を、ソートといいます。

ソートの基本的な考え方

ここではシンプルな方法として、「大きい値を前に持ってくる」方法を使います。

流れは次のようになります。

  1. 先頭と他の要素を比較する
  2. より大きい値があれば入れ替える
  3. 次の位置でも同じことを繰り返す

ソートのイメージを図で理解する

この図では、配列の中で大きい値を順番に前へ移動させていく様子を表しています。
1回の処理で最大値が先頭に移動し、そのあと残りの部分でも同じ処理を繰り返していきます。

ソートのプログラムを見てみよう

では、実際にソートを行うプログラムを見てみましょう。
ここでは、商品の価格を大きい順に並べ替える例にします。

ファイル名:Sample10.java

class Sample10
{
    public static void main(String[] args)
    {
        int[] price = {120, 450, 300, 200, 380};

        // ソート処理(大きい順)
        for(int i = 0; i < price.length - 1; i++){
            for(int j = i + 1; j < price.length; j++){
                if(price[j] > price[i]){
                    int tmp = price[j];
                    price[j] = price[i];
                    price[i] = tmp;
                }
            }
        }

        // 結果表示
        for(int p : price){
            System.out.println("並べ替え後の価格は " + p + " 円です。");
        }
    }
}

実行結果

並べ替え後の価格は 450 円です。
並べ替え後の価格は 380 円です。
並べ替え後の価格は 300 円です。
並べ替え後の価格は 200 円です。
並べ替え後の価格は 120 円です。

ソート処理の仕組みを分解してみよう

このコードのポイントは、二重のfor文です。

変数役割
i基準となる位置
j比較する相手

そして、

if(price[j] > price[i])

この条件で、

  • 後ろの値の方が大きい場合
  • 2つの値を入れ替える

という処理をしています。

そのため、処理を繰り返すと、大きい値が前に集まっていきます。

tmp変数の役割

値を入れ替えるときに使っているのが tmp です。

int tmp = price[j];
price[j] = price[i];
price[i] = tmp;

この3行は、「値を安全に交換するための定番パターン」です。

手順内容
1tmp に一時保存
2上書き
3元の値を戻す

この流れがないと、値が消えてしまうので注意が必要です。

ソートにはいろいろな方法がある

今回紹介した方法は、基本的なソートの考え方の1つです。
他にもさまざまな方法があります。

方法特徴
最大値を選ぶ方法今回の方法
隣同士を比較する方法バブルソート
分割して並べる方法クイックソートなど

扱うデータの量や用途によって、適切な方法が変わります。

配列の応用で大切なポイント

ここまでの内容で大切な点を整理しておきましょう。

ポイント内容
拡張for文添字なしで配列を処理できる
length要素数に応じてループできる
ソートデータを並び替える処理
入れ替えtmpを使うのが基本

配列は、ただ値を保存するだけでなく、「どう扱うか」で使いやすさが大きく変わります。

配列は「扱い方」を覚えると一気に便利になる

配列は、最初は値を入れて取り出すだけの単純な仕組みに見えるかもしれません。
ですが、拡張for文やソートのような応用を覚えると、一気に実用的な道具になります。

  • 簡単に取り出す → 拡張for文
  • 順番を整える → ソート

この2つは、実際のプログラムでも頻繁に使われる重要なテクニックです。

ここまで理解できれば、配列はかなり自由に扱えるようになってきています。