目的は「配列を昇順/降順で並べ替える方法」と「よくある応用(文字列・オブジェクト・元配列を残す方法)」を実際に動くサンプルで理解することです。
細かい説明→コード→出力の順で進めます。
基本ポイント(まず抑えるべきこと)
Arrays.sort(...)を使うと 配列そのものが並べ替えられる(破壊的変更)。元の並びを残したければコピーしてからソートする。Arrays.sortはプリミティブ配列(int[]等)とオブジェクト配列(String[],Integer[]など)で使えるが、降順を直接指定できるのはオブジェクト配列(ComparatorかCollections.reverseOrder()が使える)だけ。- 降順にしたいときの一般的な手法:
- 昇順でソート → 2. 要素を逆順に入れ替える(自分で反転)
または、オブジェクト配列ならArrays.sortにComparatorを渡す方法もある。
- 昇順でソート → 2. 要素を逆順に入れ替える(自分で反転)
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.copyOfやclone()を使えば元配列はそのまま保持できます。
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解説:
Comparatorのcompareは負の数 / 0 / 正の数を返して順序を決めます(Integer.compareを使うと楽)。- Java 8 以降はラムダ
(p1, p2) -> ...が書けて簡潔です。
6. よくある「つまづきポイント」と対処法
- 配列が書き変わる(元の順序を残したいならコピーする)。
int[]とInteger[]の違い:Integer[]はオブジェクト配列なのでComparator(降順やカスタム比較)が使える。int[]はプリミティブでComparatorを渡せない。- null が混ざると例外:
Arrays.sortにnull要素があるとNullPointerExceptionになることがある。注意。 - 大きい配列のパフォーマンス:標準の
Arrays.sortは高速なので普通の学習用途では気にしなくてOK。アルゴリズムの違いは中級以降で学べば十分。
まとめ(初心者向けの短い覚え方)
- 「昇順 →
Arrays.sort」 - 「降順(プリミティブ) →
Arrays.sortの後に反転する」 - 「降順(オブジェクト) →
Arrays.sort(..., Collections.reverseOrder())または Comparator」 - 「元を残したい → 配列をコピーしてからソート」
