Javaの配列ソートをやさしく説明
プログラミングを始めたばかりの人向けに、配列の並び替え(ソート)の基本を、例題を交えてわかりやすく解説します。まずは「昇順(小→大)」から始めて、次に「降順(大→小)」、そして文字列の並び替えや注意点まで押さえましょう。
配列ソートの基本(Arrays.sort)
- 基本メソッド:
Arrays.sort(配列)を呼ぶだけで、配列の中身が「昇順」に並び替わります。 - 対象: 数値(int, doubleなど)や文字列(String)もソートできます。
- ポイント: 降順はそのままだとできないので、ちょっと工夫が必要です(後述)。
import java.util.Arrays;
public class SortBasic {
public static void main(String[] args) {
int[] nums = {12, 24, 18, 35, 21};
Arrays.sort(nums); // 昇順に並び替え
System.out.println(Arrays.toString(nums)); // [12, 18, 21, 24, 35]
}
}
Java例題1:数字を昇順と降順に並べ替え
昇順(小さい → 大きい)
- やること:
Arrays.sort(nums);だけでOK。 - 結果の見方: 並び替え後の配列を
Arrays.toString()で確認。
import java.util.Arrays;
public class AscendingExample {
public static void main(String[] args) {
int[] nums = {7, 3, 9, 1, 5};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums)); // [1, 3, 5, 7, 9]
}
}
Java降順(大きい → 小さい)その1:昇順後に逆順にする
- 考え方: まず昇順にしてから、前後の要素を入れ替えて「逆順」にします。
- 理由:
Arrays.sortは基本「昇順」しかやってくれないため。
import java.util.Arrays;
public class DescendingByReverse {
public static void main(String[] args) {
int[] nums = {7, 3, 9, 1, 5};
Arrays.sort(nums); // [1, 3, 5, 7, 9]
// 逆順に並び替える
for (int left = 0, right = nums.length - 1; left < right; left++, right--) {
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
System.out.println(Arrays.toString(nums)); // [9, 7, 5, 3, 1]
}
}
Java降順(大きい → 小さい)その2:ラッパー型+Comparator(応用)
- やること:
int[]をInteger[]にして、Comparator.reverseOrder()を使う。 - メリット: 逆順への変換ループを書かなくて済む。
import java.util.Arrays;
import java.util.Comparator;
public class DescendingWithComparator {
public static void main(String[] args) {
Integer[] nums = {7, 3, 9, 1, 5}; // intではなくIntegerにする
Arrays.sort(nums, Comparator.reverseOrder());
System.out.println(Arrays.toString(nums)); // [9, 7, 5, 3, 1]
}
}
Java例題2:文字列(名前)を並び替える
昇順(辞書順:あ→ん、A→Z)
- 基本:
Arrays.sortは「辞書順」で並べます。大文字・小文字や濁点などの扱いに注意。
import java.util.Arrays;
public class StringAscending {
public static void main(String[] args) {
String[] names = {"Sato", "suzuki", "Tanaka", "ando"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// 例: [Sato, Tanaka, ando, suzuki] (大文字・小文字の違いで順序が変わる)
}
}
Java降順(Z→A)
- 方法:
Comparator.reverseOrder()を使うのがシンプル。
import java.util.Arrays;
import java.util.Comparator;
public class StringDescending {
public static void main(String[] args) {
String[] names = {"Sato", "suzuki", "Tanaka", "ando"};
Arrays.sort(names, Comparator.reverseOrder());
System.out.println(Arrays.toString(names));
// 例: [suzuki, ando, Tanaka, Sato]
}
}
Java例題3:問題に挑戦(ステップ解説付き)
問題A:テストの点数を高い順(降順)に表示する
- 与えられる配列:
{55, 80, 72, 90, 68} - 目標:
[90, 80, 72, 68, 55]と表示
import java.util.Arrays;
public class ChallengeA {
public static void main(String[] args) {
int[] scores = {55, 80, 72, 90, 68};
Arrays.sort(scores); // 1) まず昇順: [55, 68, 72, 80, 90]
for (int l = 0, r = scores.length - 1; l < r; l++, r--) { // 2) 逆順に
int t = scores[l];
scores[l] = scores[r];
scores[r] = t;
}
System.out.println(Arrays.toString(scores)); // 3) 確認: [90, 80, 72, 68, 55]
}
}
Java- ポイント解説
- 昇順にする: 比較が簡単なので、この段階は標準メソッドに任せる。
- 逆順にする: 配列の前と後を交換していく。入れ替えは「左から右へ」「右から左へ」同時に進める。
- 出力確認: 並び替えたら
Arrays.toStringで中身を確かめる。
問題B:商品名をアルファベット順で表示する(A→Z)
- 与えられる配列:
{"Banana", "apple", "Orange", "grape"} - 目標: 大文字小文字を無視して昇順に並べたい
import java.util.Arrays;
import java.util.Comparator;
public class ChallengeB {
public static void main(String[] args) {
String[] items = {"Banana", "apple", "Orange", "grape"};
Arrays.sort(items, String.CASE_INSENSITIVE_ORDER); // 大文字小文字を無視してソート
System.out.println(Arrays.toString(items)); // [apple, Banana, grape, Orange]
}
}
Java- ポイント解説
- 大文字・小文字の影響: 何もしないと、
"Z"と"a"の順序が想像と違う場合がある。 - 対策:
String.CASE_INSENSITIVE_ORDERを使うと「Apple」と「apple」を同じように扱ってソートできる。
- 大文字・小文字の影響: 何もしないと、
よくあるつまずきポイントと回避策
- 配列のままでは降順ソートがない:
- 対策: 昇順後に逆順にする、または
Integer[]にしてComparator.reverseOrder()を使う。
- 対策: 昇順後に逆順にする、または
int[]とInteger[]の違い:- ポイント:
Comparatorが使えるのはInteger[]。int[]は基本型なので使えない。
- ポイント:
- ソートは元の配列を書き換える:
- 注意:
Arrays.sortは渡した配列自体を並び替えます。元の並びが必要なら、先にコピーをとる(Arrays.copyOf)。
- 注意:
- 日本語(全角文字)の並び:
- 注意: 文字コード順になるため、期待通りの「あいうえお順」にならない場合があります。まずは英数字で感覚をつかもう。
まとめと次の一歩
- 基本はこれだけ: 昇順は
Arrays.sort、降順は「逆順にする」か「ラッパー型+Comparator」。 - 文字列は辞書順: 大小の扱いに注意。必要なら「大小無視ソート」を使う。
- 次のステップ: リスト(
ArrayList)でのソートや、オブジェクトのソート(Comparatorで「年齢で並べる」など)にも挑戦すると理解が深まります。
