Javaでデータを扱う際、配列の中身を「小さい順」や「大きい順」に並び替えたい場面は頻繁に訪れます。
ランキングの作成やデータの検索、重複の確認など、ソート(整列)処理はプログラミングの基礎中の基礎と言えるでしょう。
int などの基本データ型では降順ソートが簡単にできない」といった特有の落とし穴が存在します。「Arrays.sort を使えばいいのは知っているけど、逆順にするにはどうするの?」「2次元配列を特定の列でソートしたいけど書き方がわからない」といった疑問を持つ方も多いのではないでしょうか。
この記事では、Javaにおける配列ソートの基本である Arrays.sort メソッドの使い方から、降順(逆順)への並び替えテクニック、さらにラムダ式を使った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() を使えません。 コンパイルエラーになります。 プリミティブ型の配列を降順にしたい場合は、以下のいずれかの方法をとるのが一般的です。
- 一旦昇順にソートして、自力で逆順に入れ替える。
Integer[]などのラッパークラス配列に変換してからソートする。- ストリーム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() で int を Integer オブジェクトに変換しています。
オブジェクトになれば Comparator.reverseOrder() が使えるようになるため、ここで降順にソートを行い、最後に mapToInt と toArray で元の 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) -> ... を渡しています。
ここでの a と b は比較される「行(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エンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



