記事内にはプロモーションが含まれています

【Java】配列をソートする基本と応用!昇順・降順・2次元配列の並び替えなど

【Java】配列をソートする基本と応用!昇順・降順・2次元配列の並び替えなど Java

Javaでデータを扱う際、配列の中身を「小さい順」や「大きい順」に並び替えたい場面は頻繁に訪れます。
ランキングの作成やデータの検索、重複の確認など、ソート(整列)処理はプログラミングの基礎中の基礎と言えるでしょう。

しかし、Javaの配列ソートには「int などの基本データ型では降順ソートが簡単にできない」といった特有の落とし穴が存在します。

Arrays.sort を使えばいいのは知っているけど、逆順にするにはどうするの?」「2次元配列を特定の列でソートしたいけど書き方がわからない」といった疑問を持つ方も多いのではないでしょうか。

この記事では、Javaにおける配列ソートの基本である Arrays.sort メソッドの使い方から、降順(逆順)への並び替えテクニック、さらにラムダ式を使った2次元配列のカスタムソートまで、現在の開発現場で役立つ知識をサンプルコード付きで徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • OS:Windows 11 / macOS Sequoia
  • IDE:Visual Studio / VS Code / IntelliJ IDEA
  • その他:Chrome DevTools / 各言語最新安定版

※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。

配列を「昇順(小さい順)」にソートする基本

まずは最も基本的な、数字や文字を「昇順(小さい順、辞書順)」に並び替える方法から見ていきましょう。

Javaには配列操作のためのユーティリティクラスである java.util.Arrays が用意されており、これを使うことで簡単にソートが可能です。

Arrays.sortメソッドの使い方

使い方は非常にシンプルで、Arrays.sort() の引数にソートしたい配列を渡すだけです。

import java.util.Arrays;

public class SortExample {
    public static void main(String[] args) {
        // ソートしたい数値の配列
        int[] numbers = { 50, 10, 80, 30, 20 };

        // 配列を昇順にソートする
        Arrays.sort(numbers);

        // 結果を表示
        System.out.println("昇順ソート後: " + Arrays.toString(numbers));
        
        // 文字列の配列も同様にソート可能
        String[] fruits = { "Banana", "Apple", "Cherry" };
        Arrays.sort(fruits);
        System.out.println("文字列ソート後: " + Arrays.toString(fruits));
    }
}

実行結果

昇順ソート後: [10, 20, 30, 50, 80]
文字列ソート後: [Apple, Banana, Cherry]

Arrays.sort(numbers) を実行した時点で、元の配列 numbers の中身が書き換えられ、小さい順に整列されます。

このメソッドは、内部的に「クイックソート(デュアルピボットクイックソート)」などの高速なアルゴリズムを使用しており、大量のデータであっても効率的に処理を行ってくれます。

文字列の場合は、アルファベット順(辞書順)に並び替えられます。

配列を「降順(大きい順)」にソートする方法

次に、データを「大きい順」に並び替える降順ソートについてです。

実は、Javaの配列における降順ソートは、配列の型が「プリミティブ型(int, doubleなど)」か「参照型(Integer, Stringなど)」かによって実装方法が異なります。

参照型(Integer, String)の場合

配列の要素がクラス(参照型)の場合は、Arrays.sort の第2引数に Collections.reverseOrder() を渡すだけで降順にできます。

import java.util.Arrays;
import java.util.Collections;

public class ReverseSortExample {
    public static void main(String[] args) {
        // Integer型(ラッパークラス)の配列
        Integer[] numbers = { 50, 10, 80, 30, 20 };

        // 第2引数に降順のルールを指定してソート
        Arrays.sort(numbers, Collections.reverseOrder());

        System.out.println("降順ソート後: " + Arrays.toString(numbers));
    }
}

実行結果

降順ソート後: [80, 50, 30, 20, 10]

Collections.reverseOrder() は、自然な順序(昇順)の逆順で比較を行う「コンパレータ(比較器)」を返すメソッドです。

これを Arrays.sort に渡すことで、ソートのルールを「大きいほうが前」に変更しています。

ただし、この方法は比較可能なオブジェクト(Comparableを実装しているクラス)の配列にしか使えません。

プリミティブ型(int, double)の場合の注意点

初心者の方がよくハマるポイントですが、int[]double[] などのプリミティブ型配列には Collections.reverseOrder() を使えません。 コンパイルエラーになります。 プリミティブ型の配列を降順にしたい場合は、以下のいずれかの方法をとるのが一般的です。

  1. 一旦昇順にソートして、自力で逆順に入れ替える。
  2. Integer[] などのラッパークラス配列に変換してからソートする。
  3. ストリームAPIを使って処理する。

ここでは、最もモダンで記述が楽なストリームAPIを使った例を紹介します。

import java.util.Arrays;
import java.util.Comparator;

public class PrimitiveReverseSort {
    public static void main(String[] args) {
        int[] numbers = { 50, 10, 80, 30, 20 };

        // Streamを使ってボックス化(int -> Integer)し、降順ソート後に配列に戻す
        int[] sortedNumbers = Arrays.stream(numbers)
                                    .boxed() // Integerに変換
                                    .sorted(Comparator.reverseOrder()) // 降順ソート
                                    .mapToInt(Integer::intValue) // intに戻す
                                    .toArray();

        System.out.println("int配列の降順: " + Arrays.toString(sortedNumbers));
    }
}

実行結果

int配列の降順: [80, 50, 30, 20, 10]

Arrays.stream(numbers) で配列をストリームに変換し、.boxed()intInteger オブジェクトに変換しています。

オブジェクトになれば Comparator.reverseOrder() が使えるようになるため、ここで降順にソートを行い、最後に mapToInttoArray で元の int[] 型に戻しています。

少し記述が長くなりますが、柔軟な操作が可能です。

2次元配列や独自のルールでソートする

実務では、単なる数値の羅列ではなく、「配列の中にある配列の、2番目の要素でソートしたい(2次元配列)」や、「社員オブジェクトを年齢順にソートしたい」といったケースが多々あります。

このような複雑なソートには、ラムダ式を使った Comparator の指定が有効です。

2次元配列を特定の列でソートする

例えば、{ID, 点数} のペアが入った配列を、「点数(インデックス1)」で降順にソートしてみましょう。

import java.util.Arrays;

public class TwoDimensionalSort {
    public static void main(String[] args) {
        // {ID, 点数} のリスト
        int[][] scores = {
            {1, 70},
            {2, 100},
            {3, 50},
            {4, 90}
        };

        // 2番目の要素(点数)で降順(大きい順)にソート
        // 引数 a, b は、それぞれの行(int[])を表す
        Arrays.sort(scores, (a, b) -> Integer.compare(b[1], a[1]));

        System.out.println("点数順(降順):");
        for (int[] row : scores) {
            System.out.println(Arrays.toString(row));
        }
    }
}

実行結果

点数順(降順):
[2, 100]
[4, 90]
[1, 70]
[3, 50]

Arrays.sort の第2引数に、比較ルールを定義するラムダ式 (a, b) -> ... を渡しています。

ここでの ab は比較される「行(1次元配列)」です。
Integer.compare(b[1], a[1]) を使うことで、それぞれの配列のインデックス1(点数)を比較しています。

通常は (a, b) の順ですが、降順にしたい場合は (b, a) の順で比較メソッドに渡すのが定石テクニックです。

配列の「一部だけ」を範囲指定してソートする

配列全体ではなく、「先頭の3つだけ」や「インデックス2から5の間だけ」をソートしたい場合もあります。 Arrays.sort は、引数に範囲(開始位置と終了位置)を指定することが可能です。

範囲指定ソートの使い方

import java.util.Arrays;

public class RangeSortExample {
    public static void main(String[] args) {
        int[] numbers = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };

        // インデックス 2 から 6 の直前(2, 3, 4, 5番目の要素)だけをソート
        // 対象: {7, 6, 5, 4} -> {4, 5, 6, 7}
        Arrays.sort(numbers, 2, 6);

        System.out.println("部分ソート後: " + Arrays.toString(numbers));
    }
}

実行結果

部分ソート後: [9, 8, 4, 5, 6, 7, 3, 2, 1]

Arrays.sort(配列, 開始インデックス, 終了インデックス) の形式で呼び出します。

重要な注意点として、終了インデックスで指定した要素は範囲に含まれません(未満扱い)

この例では 2 から 6 を指定しているため、インデックス 2, 3, 4, 5 の要素がソート対象となり、インデックス 6 は含まれません。
この仕様はJavaの substring など他のAPIと共通しています。

Javaのスキルを活かして年収を上げる方法

以上、Javaで配列をソートする基本と応用について解説してきました。

なお、Javaのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Javaエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなJavaの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)