Java | 配列を「昇順・降順」に並び替えする

Java Java
スポンサーリンク

目的は「配列を昇順/降順で並べ替える方法」と「よくある応用(文字列・オブジェクト・元配列を残す方法)」を実際に動くサンプルで理解することです。
細かい説明→コード→出力の順で進めます。

基本ポイント(まず抑えるべきこと)

  • Arrays.sort(...) を使うと 配列そのものが並べ替えられる(破壊的変更)。元の並びを残したければコピーしてからソートする。
  • Arrays.sort はプリミティブ配列(int[] 等)とオブジェクト配列(String[], Integer[] など)で使えるが、降順を直接指定できるのはオブジェクト配列(ComparatorCollections.reverseOrder() が使える)だけ。
  • 降順にしたいときの一般的な手法:
    1. 昇順でソート → 2. 要素を逆順に入れ替える(自分で反転)
      または、オブジェクト配列なら Arrays.sortComparator を渡す方法もある。

1. 昇順(int配列)の基本サンプル

import java.util.Arrays;

public class SortAscExample {
    public static void main(String[] args) {
        int[] nums = {12, 24, 18, 35, 21};
        System.out.println("元の配列: " + Arrays.toString(nums));
        Arrays.sort(nums); // 昇順にソート(配列そのものが変更される)
        System.out.println("昇順: " + Arrays.toString(nums));
    }
}
Java

実行結果(例):

元の配列: [12, 24, 18, 35, 21]
昇順: [12, 18, 21, 24, 35]

解説:

  • Arrays.sort(nums) が昇順に整列します。
  • Arrays.toString は配列の中身を見やすく表示するための便利メソッド。

2. 降順にする方法(プリミティブ配列:int[] の場合)

プリミティブ配列では Arrays.sort に直接降順指定できないので、昇順後に自分で逆順に入れ替えるのがシンプルです。

import java.util.Arrays;

public class SortDescPrimitive {
    public static void main(String[] args) {
        int[] nums = {12, 24, 18, 35, 21};
        Arrays.sort(nums); // 昇順
        // 配列を反転(前と後ろをスワップ)
        for (int f = 0, l = nums.length - 1; f < l; f++, l--) {
            int tmp = nums[f];
            nums[f] = nums[l];
            nums[l] = tmp;
        }
        System.out.println("降順: " + Arrays.toString(nums));
    }
}
Java

ポイント:

  • 前後から要素を入れ替えることで O(n) の追加コストで降順にできます。

3. オブジェクト配列(Integer[] / String[])で簡単に降順にする

オブジェクト配列なら Comparator を使えるので Collections.reverseOrder() を渡せば簡単です。

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

public class SortDescObject {
    public static void main(String[] args) {
        Integer[] nums = {12, 24, 18, 35, 21}; // 注意: int[] ではなく Integer[]
        System.out.println("元: " + Arrays.toString(nums));
        Arrays.sort(nums, Collections.reverseOrder()); // 降順
        System.out.println("降順: " + Arrays.toString(nums));

        String[] names = {"sato", "tanaka", "ando", "yamamoto"};
        Arrays.sort(names, Collections.reverseOrder());
        System.out.println("names 降順: " + Arrays.toString(names));
    }
}
Java

補足:

  • int[]Integer[] にするだけで Comparator が使えるようになります(オートボクシングでも変換できるが、宣言段階で Integer[] にしておくと扱いやすい)。

4. 元の配列を残したい(ソート前の順序を保持したい場合)

元配列を保ちつつソート結果だけほしいときはコピーを作るのが安全です。

import java.util.Arrays;

public class PreserveOriginal {
    public static void main(String[] args) {
        int[] original = {5, 1, 4, 2, 3};
        int[] copy = Arrays.copyOf(original, original.length); // コピーを作成
        Arrays.sort(copy);
        System.out.println("元: " + Arrays.toString(original));
        System.out.println("ソート後: " + Arrays.toString(copy));
    }
}
Java

ポイント:

  • Arrays.copyOfclone() を使えば元配列はそのまま保持できます。

5. オブジェクト(カスタムクラス)をソートする(例:Person を年齢でソート)

Comparator を自分で書けば、任意の基準で並べ替えられます。

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

class Person {
    String name;
    int age;
    Person(String n, int a) { name = n; age = a; }
    public String toString() { return name + "(" + age + ")"; }
}

public class PersonSort {
    public static void main(String[] args) {
        Person[] people = {
            new Person("Aki", 30),
            new Person("Bun", 22),
            new Person("Cao", 28)
        };

        // 年齢の昇順でソート
        Arrays.sort(people, new Comparator<Person>() {
            public int compare(Person p1, Person p2) {
                return Integer.compare(p1.age, p2.age); // 小さい順
            }
        });
        System.out.println("年齢 昇順: " + Arrays.toString(people));

        // 年齢の降順(ラムダで短く)
        Arrays.sort(people, (p1, p2) -> Integer.compare(p2.age, p1.age));
        System.out.println("年齢 降順: " + Arrays.toString(people));
    }
}
Java

解説:

  • Comparatorcompare は負の数 / 0 / 正の数を返して順序を決めます(Integer.compare を使うと楽)。
  • Java 8 以降はラムダ (p1, p2) -> ... が書けて簡潔です。

6. よくある「つまづきポイント」と対処法

  • 配列が書き変わる(元の順序を残したいならコピーする)。
  • int[]Integer[] の違いInteger[] はオブジェクト配列なので Comparator(降順やカスタム比較)が使える。int[] はプリミティブで Comparator を渡せない。
  • null が混ざると例外Arrays.sortnull 要素があると NullPointerException になることがある。注意。
  • 大きい配列のパフォーマンス:標準の Arrays.sort は高速なので普通の学習用途では気にしなくてOK。アルゴリズムの違いは中級以降で学べば十分。

まとめ(初心者向けの短い覚え方)

  • 「昇順 → Arrays.sort
  • 「降順(プリミティブ) → Arrays.sort の後に反転する」
  • 「降順(オブジェクト) → Arrays.sort(..., Collections.reverseOrder()) または Comparator」
  • 「元を残したい → 配列をコピーしてからソート」
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました