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

Java Java
スポンサーリンク

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で「年齢で並べる」など)にも挑戦すると理解が深まります。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました