PR

【Java】Comparatorとは?Comparableとの違いと並び替え

unDrawのSorting Thoughtsイラストを使いComparatorの並び替えを表すアイキャッチ画像 Java

Comparatorは、並び替えのルールをクラスの外から渡すためのインターフェースです。

既存のComparable記事では、クラス自身に自然な順序を持たせる考え方を扱っています。一方、Comparatorは『今回は名前順』『今回は年齢順』のように、場面ごとの比べ方を外から渡したいときに使います。

Comparableはクラスに内蔵する比べ方、Comparatorは外から渡す比べ方、と分けると理解しやすいです。

この記事では、Comparatorの意味、既存記事との違い、コードの読み方、初心者がつまずきやすい点を順番に整理します。

スポンサーリンク

まず結論:Comparatorは外から渡す比べ方

Comparatorは、並び替えの条件を柔軟に変えたいときに便利です。Javaの実務コードでは、Listのsort、Collections.sort、Streamのsortedなどで頻繁に登場します。

次の図では、Comparatorを『外から渡す比べ方』として見てください。

Comparatorを年齢順などの並び替えルールカードとして表すイメージ
Comparatorは、データ本体とは別に『どう比べるか』を渡すルールカードです。

この分け方を持つと、Comparableとの違いが自然に整理できます。

Comparableとの違い

比較ComparableComparator
置き場所クラス自身に実装する外側で別に作る
使いどころ自然な順序を1つ決めたい場面ごとに並び替えたい
メソッドcompareTocompare
ラムダ式基本的には使わないラムダ式と相性が良い

Comparableの基本はjava.lang.Comparableの記事で扱っています。Comparatorはその次の応用として読むと理解しやすいです。

まずはこのコードを読めればOK

まずは、ユーザー一覧を年齢順に並び替えるコードを見てみます。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

record User(String name, int age) {}

List<User> users = new ArrayList<>();
users.add(new User("Sato", 32));
users.add(new User("Suzuki", 25));

users.sort(Comparator.comparing(User::age));
System.out.println(users);

Comparator.comparing(User::age)は、『Userのageを見て比べる』という並び替えルールを作っています。クラス本体に年齢順を固定していない点がポイントです。

sortで使われる流れ

次の図では、sortがComparatorを使う流れを確認してください。

Comparableはクラス内の基本ルールでComparatorは外から渡す場面ごとのルールであることを示すイメージ
Comparableはクラス自身の基本順序、Comparatorは場面ごとに外から渡す順序です。

Comparatorだけが動いているのではなく、sortがComparatorに比べ方を聞いていると考えます。

Comparatorは、並び替え処理そのものではなく『どちらを先にするかを決めるルール』です。sortメソッドがそのルールを使って並び替えます。

初心者がつまずきやすいポイント

つまずきまずこう読む
Comparatorがソート処理本体だと思うComparatorは比べ方、sortが並び替える
戻り値の正負が分からない先後関係を数値で返す
Comparableとの違いが混ざる内蔵ルールか外付けルールかで分ける
ラムダ式で急に読めなくなる引数2つを比べる関数として読む

最後の図では、Comparable、Comparator、ラムダ式の関係を確認してください。

Comparator.comparing User age が年齢カードを見る指定であることを示す図
Comparator.comparing(User::age)は、Userのageを見て比べるルールを作っています。

置き場所を見れば、どちらの仕組みを使っているか判断しやすくなります。

Comparatorを使う場面

  • 名前順、年齢順など条件を切り替えたい
  • 既存クラスを変更せずに並び替えたい
  • 画面表示の並び順を一時的に変えたい
  • ラムダ式で短く並び替えを書きたい

Comparatorを理解すると、ラムダ式が単なる短縮構文ではなく『処理を値として渡す』考え方につながります。

次の図では、年齢が同じときに名前順で決める流れを確認してください。

年齢で同点になったUserを名前順カードでさらに並べるthenComparingのイメージ
thenComparingは、最初の比較で同じだった場合に、次の比較条件を見るための仕組みです。

複数条件の並び替えは、最初のルール、同点時のルール、という順番で読むと整理できます。

実務コードで読むときのコツ

実務コードでComparatorが出てきたら、最初に見るべきなのは『何を扱うために使っているのか』です。クラス名やメソッド名だけを暗記するより、データの目的を日本語に直す方が理解しやすくなります。

次に、変数の型、呼び出しているメソッド、戻り値の3つを順番に確認します。型を見ると入れ物の性質が分かり、メソッドを見ると何をしたいのかが分かり、戻り値を見ると次の処理へどうつながるかが分かります。

この記事の範囲では、Comparatorを完全に使いこなすことよりも、初見のコードで立ち止まらないことを優先しています。細かい仕様は公式APIで確認しながら、まずは代表的な使い方を読める状態を作りましょう。

チーム開発では、同じ機能を別の書き方で実現できる場合もあります。そのため『この書き方だけが正解』と覚えるのではなく、なぜその場面でそのクラスや構文が選ばれているのかを考えるのが大切です。

もう1つ大事なのは、サンプルコードと実務コードでは情報量が違うという点です。実務コードでは、変数名、メソッド名、例外処理、戻り値の受け渡しが同時に出てきます。読み始めで混乱したら、まずこのページで扱った最小コードまで戻し、1行ずつ役割を書き出すと整理できます。

特にComparatorのような基礎概念は、単独で覚えるより、既存記事の文法やクラスライブラリとつなげて読む方が定着します。『どの前提知識が使われているか』を確認する癖をつけると、初めて見るAPIや構文にも対応しやすくなります。

判断に迷ったときの基準

Comparatorを使うべきか迷ったときは、先に目的を言葉にしてみます。目的が言葉で説明できないままコードを書き始めると、似たクラスや似た構文との違いが見えなくなります。

確認すること見るポイント
扱いたいデータ値、一覧、例外、日付など何を扱うのか
必要な操作追加、比較、変換、確認、表示など何をしたいのか
既存記事との関係基礎文法、クラス、コレクション、例外処理のどれにつながるか
注意点順番、null、例外、戻り値、不変性など見落としやすい点

この4点を先に確認すると、単なる暗記ではなく、コードを読むための判断軸ができます。初心者向けの記事でも、この判断軸まで持てると、次の応用記事へ進みやすくなります。

練習問題

理解を確認するために、次の観点でサンプルコードを自分で説明してみてください。実行できる環境がある場合は、少し値を変えて結果がどう変わるかも試すと定着しやすくなります。

  • Comparatorは何を扱うために使われているか説明する
  • コードの中で一番重要なメソッドを1つ選び、役割を説明する
  • 既存記事で学んだ概念とどこがつながるか説明する
  • 初心者が間違えやすいポイントを1つ挙げ、回避方法を書く

練習では、正確な用語を最初から完璧に使う必要はありません。まずは『何を入れて、何を取り出し、どの条件で動きが変わるのか』を自分の言葉で言えることを目標にしてください。

よくある疑問

最初から細かい仕様まで覚えるべき?

最初からすべてのメソッドや内部仕様を暗記する必要はありません。初心者の段階では、代表的な使い方、よくあるつまずき、既存記事とのつながりを押さえれば十分です。必要になったタイミングで公式APIを確認する習慣を作りましょう。

既存記事とは何が違う?

Comparable、ラムダ式、コレクション、並び替え処理を接続する記事。

次に何を読めばよい?

次に読む記事は、本文末尾の内部リンクから選ぶのがおすすめです。基礎概念が不安なら親記事へ戻り、コードの応用を見たい場合は関連する文法やライブラリの記事へ進むと理解がつながります。

既存記事とあわせて読む順番

学習順は、クラス、インターフェース、Comparable、ラムダ式、Comparatorの順が自然です。Comparatorを読むと、Stream APIのsortedも理解しやすくなります。

公式情報と関連して読みたい記事

まとめ

Comparatorは、並び替えのルールを外から渡すためのインターフェースです。

  • Comparatorは外から渡す比べ方
  • Comparableはクラス自身の自然な順序
  • sortがComparatorを使って並び替える
  • ラムダ式やメソッド参照と相性が良い

Comparatorを理解すると、一覧をどの条件で並べるかをコードから読み取れるようになります。

タイトルとURLをコピーしました