Java | Java 標準ライブラリ:Arrays.sort

Java Java
スポンサーリンク

Arrays.sort の役割をざっくりつかむ

Arrays.sort は「配列を並び替えるための標準メソッド」です。
int[]String[] などの配列を、昇順(小さい順・辞書順)に一発で整列してくれます。

自分でソートアルゴリズム(バブルソートやクイックソートなど)を書かなくても、
Arrays.sort(配列); と呼ぶだけで、標準ライブラリが速くて安定した並び替えをやってくれます。

大事なのは、「元の配列をその場で並べ替える(新しい配列を返さない)」という点です。
つまり、sort を呼んだ後は、同じ配列変数の中身がソート済みになっています。


基本形:int 配列や String 配列を昇順に並べ替える

int[] を小さい順にソートする

最も基本的な形から見てみます。

import java.util.Arrays;

public class SortBasic {
    public static void main(String[] args) {
        int[] numbers = {5, 2, 9, 1, 3};

        Arrays.sort(numbers);  // 昇順に並べ替え

        System.out.println(Arrays.toString(numbers));  // [1, 2, 3, 5, 9]
    }
}
Java

Arrays.sort(numbers); を呼んだ瞬間に、numbers の中身がソートされます。
sort メソッドは戻り値を返しません(void)が、それで正しい動きです。
配列がその場で並べ替えられているので、「戻り値を受け取らないといけない」と勘違いしないようにしてください。

String[] を辞書順にソートする

文字列配列の場合は「辞書順(アルファベット順)」に並びます。

import java.util.Arrays;

public class SortString {
    public static void main(String[] args) {
        String[] names = {"Bob", "Alice", "Carol"};

        Arrays.sort(names);  // 辞書順に並べ替え

        System.out.println(Arrays.toString(names));  // [Alice, Bob, Carol]
    }
}
Java

日本語を含む場合も、「文字コード順」に並びます。
アプリとして本気で日本語の五十音順を制御したい場合は少し話が難しくなりますが、
初心者のうちは「とりあえず Arrays.sort で文字列も並ぶ」と覚えておけば大丈夫です。


部分だけソートする:range 版の sort

配列全体ではなく一部だけ並べ替えたいとき

配列の一部の範囲だけをソートしたい場面もあります。
そのときは、Arrays.sort(array, fromIndex, toIndex); を使います。

import java.util.Arrays;

public class SortRange {
    public static void main(String[] args) {
        int[] numbers = {9, 7, 5, 3, 1};

        Arrays.sort(numbers, 1, 4);  // index 1〜3 をソート(4 は含まない)

        System.out.println(Arrays.toString(numbers));  // [9, 3, 5, 7, 1]
    }
}
Java

ここでは、numbers[1] から numbers[3] まで、つまり {7, 5, 3} の部分だけがソートされ、
配列全体は [9, 3, 5, 7, 1] になります。

fromIndex は「含む」、toIndex は「含まない」というのが Java のお約束です。
String.substring の範囲指定と同じ感覚だと覚えておくと混乱しにくいです。


参照型(オブジェクト配列)のソートと Comparator

Integer[] や独自クラスをソートする基本

int[] のようなプリミティブ型配列だけでなく、Integer[]String[] などのオブジェクト配列も sort できます。
基本的には「そのクラスの自然な順序(natural order)」で並びます。

Integer[] なら数値の小さい順、String[] なら辞書順です。

import java.util.Arrays;

public class SortIntegerObject {
    public static void main(String[] args) {
        Integer[] numbers = {5, 2, 9, 1, 3};

        Arrays.sort(numbers);  // Integer の自然順(数値昇順)

        System.out.println(Arrays.toString(numbers));  // [1, 2, 3, 5, 9]
    }
}
Java

自分で定義したクラスをソートしたい場合は、そのクラスが Comparable を実装しているか、
Comparator を渡す形で Arrays.sort を呼びます。
これは一歩進んだ話なので、最初は「String[]Integer[] はそのまま sort できる」だけ押さえておけば十分です。

降順でソートしたいときの考え方

Arrays.sort は基本「昇順」ですが、オブジェクト配列なら Comparator を渡して降順にできます。

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

public class SortDescending {
    public static void main(String[] args) {
        Integer[] numbers = {5, 2, 9, 1, 3};

        Arrays.sort(numbers, Collections.reverseOrder());  // 降順

        System.out.println(Arrays.toString(numbers));  // [9, 5, 3, 2, 1]
    }
}
Java

int[] などのプリミティブ配列ではこの書き方は使えないので、
どうしても降順のプリミティブ配列が欲しい場合は、いったん昇順にソートしてから逆順に並べ替える、
あるいは Integer[] に変えるなど、少し工夫がいります。


Arrays.sort の「その場でソートされる」性質と注意点

新しい配列は返されないことを理解する

多くの初心者が一度はやりがちなのが、次のようなコードです。

int[] numbers = {5, 2, 9, 1, 3};

int[] sorted = Arrays.sort(numbers);  // コンパイルエラー
Java

Arrays.sort の戻り値は void なので、変数に代入できません。
ソートした配列を別名で持ちたい場合は、先にコピーを作ります。

import java.util.Arrays;

int[] numbers = {5, 2, 9, 1, 3};
int[] sorted = Arrays.copyOf(numbers, numbers.length);

Arrays.sort(sorted);  // sorted のみソートされる

System.out.println(Arrays.toString(numbers));  // 元の順番のまま
System.out.println(Arrays.toString(sorted));   // ソート後
Java

「元の配列も残しておきたいか?」「上書きでいいか?」は、設計として必ず意識しておくべきポイントです。

null が混ざっている配列のソート

参照型配列(String[]Integer[])に null が入っていると、
Arrays.sortNullPointerException が発生することがあります。

String[] names = {"Alice", null, "Bob"};
Arrays.sort(names);  // ここで例外になる可能性
Java

ソート前に null を除去する、null を末尾に集めてからソートする、
または Comparatornull の扱いを明示するなどの工夫が必要です。
初心者のうちは、「ソート対象の配列の中には null を入れない」が一番シンプルなルールです。


binarySearch と組み合わせるときの大事な前提

binarySearch は「ソート済み配列」が前提

Arrays.binarySearch は、ソート済み配列に対して高速に検索するメソッドです。
ここでの前提が「ソート済み」であることです。

例えば、次のコードは正しく動きます。

import java.util.Arrays;

int[] numbers = {5, 2, 9, 1, 3};

Arrays.sort(numbers);  // 必ず先にソートする
int index = Arrays.binarySearch(numbers, 5);

System.out.println(index);  // ソート後の配列中での 5 の位置
Java

もしソートせずに binarySearch を呼ぶと、
結果は「正しいかどうか分からない数字」になります。

Arrays.sort で配列を昇順に整えておく
その配列に対して binarySearch で値を探す

というのは、「セットで覚えるべきパターン」です。


まとめ:Arrays.sort をどう自分の感覚に落とし込むか

Arrays.sort を初心者向けに一言でまとめると、

「配列を昇順(小さい順・辞書順)に、その場で並べ替えるための標準メソッド」

です。

頭に置いておきたいポイントは、次のようなイメージです。

配列をソートしたければ、とにかく Arrays.sort(array);
戻り値はなく、元の配列インスタンスの中身が並べ替えられる
部分ソートなら Arrays.sort(array, fromIndex, toIndex)
オブジェクト配列は自然な順序でソートされる。降順や独自順は Comparator を渡す
binarySearch を使いたいなら、まず Arrays.sort でソートしておく

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