【Java】2次元配列をソートする方法まとめ|初心者向けサンプル付き解説

お疲れ様です。はるさらと申します。

Javaで開発を進めていると「2次元配列を並び替えたい」というケースは
意外と多く出てきます。
たとえば、社員データを「年齢順」にソートしたり、
売上データを「金額の大きい順」に並べ替えたいといった場面です。

この記事では、経験の浅い方でも理解しやすいように
サンプルコード付きで、2次元配列のソート方法を解説していきます。
また、実務でよく使うケースや代替手法も紹介しますので、ぜひ参考にしてください。


Javaで2次元配列をソートする必要性

2次元配列は「表形式のデータ」を扱うときに便利です。
例えば以下のように [id, 名前, 年齢] の形式でデータを持っているとしましょう。

String[][] users = {
    {"1", "Tanaka", "25"},
    {"2", "Sato", "30"},
    {"3", "Yamada", "22"}
};

ここで「年齢の昇順に並べ替えたい」と思ったら、
2次元配列の特定の列を基準にソートする必要があります。
しかし、1次元配列やListと比べると少し難易度が高く、
経験の浅い方がつまずきやすいポイントでもあります。


基本のサンプル:2次元配列を年齢で昇順ソート

まずは基本的なサンプルです。
JavaのArrays.sortメソッドに値を渡して並び替えます。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[][] users = {
            {"1", "Tanaka", "25"},
            {"2", "Sato", "30"},
            {"3", "Yamada", "22"}
        };

        // 年齢(インデックス2)で昇順ソート
        Arrays.sort(users, (a, b) -> Integer.compare(
            Integer.parseInt(a[2]), 
            Integer.parseInt(b[2])
        ));

        // 結果を出力
        for (String[] user : users) {
            System.out.println(Arrays.toString(user));
        }
    }
}

実行結果

[3, Yamada, 22]
[1, Tanaka, 25]
[2, Sato, 30]

このように、インデックスを指定して比較処理を書けば、
任意の列を基準にソートできます。


実務でよく使う応用例:売上データを金額の降順で並び替える

現場では、2次元配列を「数字の大きい順」「日付の新しい順」に
ソートするケースが多いです。
以下は売上データ [商品名, 金額] を降順にソートする例です。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[][] sales = {
            {"PC", "150000"},
            {"Phone", "80000"},
            {"Tablet", "120000"}
        };

        // 金額(インデックス1)で降順ソート
        Arrays.sort(sales, (a, b) -> Integer.compare(
            Integer.parseInt(b[1]), 
            Integer.parseInt(a[1])
        ));

        for (String[] s : sales) {
            System.out.println(Arrays.toString(s));
        }
    }
}

実行結果

[PC, 150000]
[Tablet, 120000]
[Phone, 80000]

このように「ab の順番を逆にする」だけで降順にできます。


代替手法の比較:Listに変換してソートする

2次元配列のままだと可読性が下がりやすいため、
Listに変換してからソートする方法もよく使われます。
こちらの方が柔軟性が高く、JavaのStreamAPIとも組み合わせやすいです。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String[]> users = new ArrayList<>();
        users.add(new String[]{"1", "Tanaka", "25"});
        users.add(new String[]{"2", "Sato", "30"});
        users.add(new String[]{"3", "Yamada", "22"});

        // 年齢(インデックス2)で昇順ソート
        users.sort(Comparator.comparingInt(a -> Integer.parseInt(a[2])));

        for (String[] user : users) {
            System.out.println(Arrays.toString(user));
        }
    }
}

この方法は、List操作に慣れている方にとって扱いやすいのがメリットです。


注意点:間違えやすいポイント

2次元配列のソートを行うときに、
間違えやすい点を整理しておきます。

  1. 文字列を数値に変換せずに比較してしまう
    "30""100" を文字列で比較すると、
    辞書順になり意図しない結果になります。必ずInteger.parseIntで数値変換しましょう。
  2. 配列のインデックスを間違える
    [id, 名前, 年齢] の形式なのに、
    年齢をソートするつもりでインデックス1を指定してしまうと「名前順」になります。
  3. 降順ソートの実装を忘れる
    Integer.compare(a, b) では昇順、
    降順にしたい場合は Integer.compare(b, a) と逆にする必要があります。

まとめ

  • Javaで2次元配列をソートするには、Arrays.sortにコンパレータを渡す方法が基本。
  • 実務では「数値の降順」や「日付順」で並べ替えるケースが多い。
  • Listに変換してソートする方法もあり、柔軟性が高い。
  • 文字列を数値に変換し忘れたり、インデックスを間違えると意図しない結果になるので注意が必要。

2次元配列はシンプルなデータ構造ですが、
並べ替えを正しく実装できると業務効率も大きく向上します。
今回紹介したサンプルコードを活用して、ぜひ現場の開発に役立ててみてください。

どなたかのお役に立てば幸いです。
それではまたー!