【Java】sortで配列(Array)の要素の並び替え(ソート)を行う!
配列の要素の並び替え(ソート)を行うにはArraysクラスのsortメソッドを使用します。
Arraysクラスのsortメソッドは、配列の要素を並び替えるメソッドです。
そのため、無作為に並んでいる要素を順番に並び替える際にsortメソッドが使用されます。
また、CollectionsクラスのreverseOrderメソッドを使うことで要素を降順に並び替えることができ、Comparatorクラスを使用することで自分の決めたルールで要素を並び替えることもできます。
Arrayクラスのsortメソッドを使って以下の場合で配列の要素の並び替え(ソート)を行います。
⚫︎ 配列の要素を昇順に並び替える場合
⚫︎ 配列の範囲を設定して要素を並び替える場合
⚫︎ 配列の要素を降順に並び替える場合
⚫︎ 配列の要素を自分のルールで並び替える場合
目次
sortメソッドとは
Arraysクラスのsortメソッドとは、配列の要素を並び替えるメソッドになります。
sortメソッドの書き方
Arraysクラスのsortメソッドの構文は下記となります。
1 2 3 |
import java.util.Arrays; Arrays.sort(配列 [,開始インデックス, 終了インデックス]); |
まず、sortメソッドが使用できるように Arraysクラスをインポートします。
⚫︎ 配列:
並び替えたい配列を指定する
⚫︎ 開始インデックス:
並び替えを始めたい配列の要素の番号を指定する
⚫︎ 終了インデックス:
並び替えを終えたい配列の要素の番号を指定する
sortの第1パラメータとして配列を指定することで配列の要素を並び替え、第2パラメータとして開始インデックスを第3パラメータとして終了インデックス指定することで要素を並び替えの範囲を設定すします。
デフォルトのソートは昇順になります。
また、sortメソッドの構文は下記の様にも書くこともできます。
1 |
Arrays.sort(配列 [,コンパレータ]); |
第2パラメータとしてコンパレータを指定することでコンパレータが示す順序に従って、指定された配列をソートします。
sortメソッドの注意点
sortメソッドは戻り値を戻しません。
つまり、引数で渡した配列の中身を書き換えてソートしてしまい、ソート前の配列のバックアップが取れませんので注意してください。
配列の要素の並び替えを行うサンプルコード
ディレクトリ内のファイル一覧を取得するサンプルコードを紹介します。
要素を昇順に並び替える場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// 配列の要素をソートする import java.util.Arrays; import java.util.Comparator; public class Main { public static void main(String[] args) throws Exception { // 数値の配列を用意する Integer [] array = new Integer [6]; Main.setElement(array); System.out.println("自然順序付けでソートする"); // ソート前のリストの中身を表示する System.out.println("・ソート前"); System.out.println(Arrays.toString(array)); // ソートを実行 Arrays.sort(array); // ソート後のリストの中身を表示する System.out.println("・ソート後"); System.out.println(Arrays.toString(array)); } // 配列の初期化を行うメソッド static void setElement(Integer [] array) { // 配列に要素を設定 array[0] = Integer.valueOf(100); array[1] = Integer.valueOf(351); array[2] = Integer.valueOf(207); array[3] = Integer.valueOf(192); array[4] = Integer.valueOf(123); array[5] = Integer.valueOf(64); } } |
出力結果
昇順でソートする
・ソート前
[100, 351, 207, 192, 123, 64]
・ソート後
[64, 100, 123, 192, 207, 351]
sortメソッドによって配列の中身が昇順に並び替えられています。
範囲設定して要素を並び替える場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// 配列の要素をソートする import java.util.Arrays; import java.util.Comparator; public class Main { public static void main(String[] args) throws Exception { // 数値の配列を用意する Integer [] array = new Integer [6]; Main.setElement(array); System.out.println("自然順序付けでソートする"); // ソート前のリストの中身を表示する System.out.println("・ソート前"); System.out.println(Arrays.toString(array)); // ソートを実行 Arrays.sort(array, 1, 4); // ソート後のリストの中身を表示する System.out.println("・ソート後"); System.out.println(Arrays.toString(array)); } // 配列の初期化を行うメソッド static void setElement(Integer [] array) { // 配列に要素を設定 array[0] = Integer.valueOf(100); array[1] = Integer.valueOf(351); array[2] = Integer.valueOf(207); array[3] = Integer.valueOf(192); array[4] = Integer.valueOf(123); array[5] = Integer.valueOf(64); } } |
出力結果
昇順でソートする
・ソート前
[100, 351, 207, 192, 123, 64]
・ソート後
[100, 192, 207, 351, 123, 64]
sortメソッドに開始インデックスと終了インデックスを指定することで並び替える範囲を設定し、配列の設定した範囲のみが昇順に並び替えられています。
要素を降順に並び替える場合
要素を降順に並び替える場合にはCollectionsクラスのreverseOrderメソッドを使用します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// 配列の要素をソートする import java.util.Arrays; import java.util.Collections; public class Main { public static void main(String[] args) throws Exception { // 数値の配列を用意する Integer [] array = new Integer [6]; Main.setElement(array); System.out.println("降順でソートする"); // ソート前のリストの中身を表示する System.out.println("・ソート前"); System.out.println(Arrays.toString(array)); // ソートを実行 Arrays.sort(array, Collections.reverseOrder()); // ソート後のリストの中身を表示する System.out.println("・ソート後"); System.out.println(Arrays.toString(array)); } // 配列の初期化を行うメソッド static void setElement(Integer [] array) { // 配列に要素を設定 array[0] = Integer.valueOf(100); array[1] = Integer.valueOf(351); array[2] = Integer.valueOf(207); array[3] = Integer.valueOf(192); array[4] = Integer.valueOf(123); array[5] = Integer.valueOf(64); } } |
出力結果
降順でソートする
・ソート前
[100, 351, 207, 192, 123, 64]
・ソート後
[351, 207, 192, 123, 100, 64]
sortメソッドの中にCollectionsクラスのreverseOrderメソッドを指定することで配列の中身が降順に並び替えられています。
要素を自分のルールで並び替える場合
自分のルールで要素を並び替える場合は「Comparator」インタフェースを実装したクラスを用意します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
// 配列の要素をソートする import java.util.Arrays; import java.util.Comparator; public class Main { public static void main(String[] args) throws Exception { // 数値の配列を用意する Integer[] array = new Integer [6]; Main.setElement(array); System.out.println("自作のルールでソートする"); // 奇数だけでソート、その後に偶数のみのソートを行うという // Comparatorを匿名クラスを使って作成する Comparator<Integer> comp = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { int val1 = o1.intValue(); int val2 = o2.intValue(); if (val1 % 2 == 1 && val2 % 2 == 0){ return -1; }else if (val1 % 2 == 0 && val2 % 2 == 1) { return 1; } return o1.compareTo(o2); } }; // ソート前のリストの中身を表示する System.out.println("・ソート前"); System.out.println(Arrays.toString(array)); // ソートを実行 Arrays.sort(array, comp); //ソート前のリストの中身を表示する System.out.println("・ソート後"); System.out.println(Arrays.toString(array)); } // 配列の初期化を行うメソッド static void setElement(Integer[] array) { // 配列に要素を設定 array[0] = Integer.valueOf(100); array[1] = Integer.valueOf(351); array[2] = Integer.valueOf(207); array[3] = Integer.valueOf(192); array[4] = Integer.valueOf(123); array[5] = Integer.valueOf(64); } } |
出力結果
自作のルールでソートする
・ソート前
[100, 351, 207, 192, 123, 64]
・ソート後
[123, 207, 351, 64, 100, 192]
今回のポイント
sortで配列の要素の並び替える
配列の要素をソートするにはArraysクラスのsortメソッドを使用する
⚫︎ Arraysクラスのsortメソッドで配列の要素をソートする
⚫︎ 配列だけをパラメータとして渡すと、自然順序付け(昇順)でソートする
⚫︎ 配列の要素を降順に並び替える場合は第2パラメータにCollectionsクラスのreverseOrderメソッドを指定する
⚫︎ 自分でソートのルールを決める場合は、「Comparator」インタフェースを実装したクラスを用意する
(サンプルコードでは、最初は奇数だけでソートし、次に偶数だけでソートするルールを作成している)
関連記事
配列の中身を表示する方法ついてはこちらをご参考ください。
リストの要素をソートする方法ついてはこちらをご参考ください。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。