java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

int型配列のソート

投稿日:

最終更新日:2016年07月19日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回は配列のソートについて書こうと思います。

sortメソッド

Arraysクラスにsortメソッドが用意されてます。

int型の場合、以下の2つのメソッドがあります。

  1. static void sort(int[] a)
  2. static void sort(int[] a, int fromIndex, int toIndex)

API仕様書を見ると各数値型に対して同様のメソッドが用意されているようです。「static void sort(int[] a)」は引数に指定した配列を昇順でソートしてくれます。「static void sort(int[] a, int fromIndex, int toIndex)」は指定された範囲だけを昇順にソートしてくれます。

昇順で並び替え

今回は要素数10個のint型配列にランダムに数値を入れてsortメソッドを使ってみました。

ソースコード

package arraysTest;
import java.util.Arrays;
import java.util.Random;

public class HelloSort {

    public static void main(String[] args) {

        int[] nums = new int[10];
        Random random = new Random();

        for (int i = 0; i < nums.length; i++) {
            nums[i] = random.nextInt(10);
        }

        System.out.println("ソート前");
        System.out.println(Arrays.toString(nums));

        Arrays.sort(nums);

        System.out.println("ソート前");
        System.out.println(Arrays.toString(nums));


    }

}

結果

ソート前
[6, 4, 6, 9, 9, 5, 9, 0, 1, 8]
ソート前
[0, 1, 4, 5, 6, 6, 8, 9, 9, 9]

上記のように、昇順でソートされました。出力で使っているArrays#toStringメソッドは配列を[カンマ区切り]の形で出力してくれるメソッドのようです。

降順で並び替え

さて、降順に並び替えるのはどうすれば良いのでしょうか。メソッドは用意されてないらしいので、sortメソッドで並び替えたあと、逆順にする方法を使えばよいのでしょう。以下、メソッドを作って実行してみました。

ソースコード

package arraysTest;
import java.util.Arrays;
import java.util.Random;

public class HelloSortDesc {

    public static void main(String[] args) {

        int[] nums = new int[10];
        Random random = new Random();

        for (int i = 0; i < nums.length; i++) {
            nums[i] = random.nextInt(100);
        }

        System.out.println("ソート前");
        System.out.println(Arrays.toString(nums));

        sortDesc(nums);

        System.out.println("ソート前");
        System.out.println(Arrays.toString(nums));


    }

    private static void sortDesc(int[] nums) {

        Arrays.sort(nums);

        int[] numsTemp = new int[nums.length];

        for (int i = 0; i < nums.length; i++) {
            numsTemp[i] = nums[nums.length - 1 - i];
        }

        for (int i = 0; i < nums.length; i++) {
            nums[i] = numsTemp[i];
        }

    }

}

結果

ソート前
[12, 2, 51, 58, 58, 99, 34, 55, 85, 93]
ソート前
[99, 93, 85, 58, 58, 55, 51, 34, 12, 2]

単純に、一時的な配列に詰め込んで、元の配列に詰め込みなおしただけです。引数の配列を操作すると呼び出し元の引数の配列の内容も変わります。