Arrays.sortとソート
プリミティブ配列とオブジェクト配列をソートします
「Arrays.sortとソート」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
ユーティリティクラスを使う理由
Javaの配列はオブジェクトですが、組み込みメソッドはほとんどありません。java.util.Arraysクラスは、配列のソート、検索、比較、コピー、出力を行うstaticヘルパーメソッドを提供して、この不足を補います。
import java.util.Arrays;でインポートする- すべてのメソッドが
staticなので、クラス自体に対して呼び出す:Arrays.sort(...)
プリミティブ配列をソートする
Arrays.sort(int[])は、高速なデュアルピボットクイックソートを使って配列をインプレースでソートします。戻り値はなく、元の配列が並べ替えられます。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {5, 2, 8, 1, 9, 3};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
}
}ほかのプリミティブ型をソートする
すべてのプリミティブ型にオーバーロードが用意されています。たとえばdouble[]、long[]、char[]などです。いずれも昇順にソートします。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
double[] prices = {3.5, 1.2, 9.9, 0.5};
Arrays.sort(prices);
System.out.println(Arrays.toString(prices));
}
}範囲を指定してソートする
Arrays.sort(array, fromIndex, toIndex)を使うと、配列の一部だけをソートできます。範囲はfromIndexを含み、toIndexを含みません。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {5, 2, 8, 1, 9, 3};
Arrays.sort(nums, 1, 4);
System.out.println(Arrays.toString(nums));
}
}オブジェクト配列をソートする
String[]などのオブジェクト配列では、Arrays.sortは要素の自然順序(要素のComparable実装)を使います。文字列は辞書順にソートされます。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] names = {"Charlie", "Alice", "Bob"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
}
}Comparatorを使ってソートする
自然順序を変更するには、Comparatorを渡します。Comparator.reverseOrder()を使うと降順にソートされます。これはオブジェクト配列でのみ機能し、プリミティブ配列では使えません。
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] names = {"Charlie", "Alice", "Bob"};
Arrays.sort(names, Comparator.reverseOrder());
System.out.println(Arrays.toString(names));
}
}長さでComparatorを指定する
Comparatorでは、任意のプロパティを基準に比較できます。Comparator.comparingInt(String::length)を使うと、文字列を短いものから長いものへソートします。
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] words = {"banana", "fig", "apple"};
Arrays.sort(words, Comparator.comparingInt(String::length));
System.out.println(Arrays.toString(words));
}
}安定性
オブジェクト配列のソートは安定しています。同じ要素は元の相対的な順序を維持します。プリミティブ型のソートには安定性が保証されませんが、プリミティブ型では同じ値を区別できないため問題ありません。
並列ソート
非常に大きな配列では、Arrays.parallelSortが処理を複数のCPUコアに分散します。APIはsortと同じで、結果も同じですが、大量のデータではより高速になります。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {7, 3, 9, 1, 5, 2, 8, 4};
Arrays.parallelSort(nums);
System.out.println(Arrays.toString(nums));
}
}よくある落とし穴
Arrays.sortの戻り値はvoidです。int[] sorted = Arrays.sort(nums);のようなコードはコンパイルできません。先にソートしてから、同じ変数を使ってください。
ソートしてから出力する
典型的な流れは、配列をインプレースでソートし、その結果を確認するためにArrays.toStringで出力することです。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] scores = {88, 72, 95, 60, 81};
Arrays.sort(scores);
System.out.println("Lowest: " + scores[0]);
System.out.println("Highest: " + scores[scores.length - 1]);
System.out.println(Arrays.toString(scores));
}
}確認問題
ソートについての理解を確認しましょう。
まとめ
Arraysユーティリティクラスを使って配列をソートする方法を学びました。
Arrays.sort(arr)はプリミティブ型またはオブジェクトをインプレースで昇順にソートする- 範囲を指定するオーバーロード
sort(arr, from, to)で配列の一部をソートする - オブジェクト配列では、独自の順序を指定する
Comparatorを使える parallelSortで大きな配列の処理を高速化できる
よくある質問
「Arrays.sortとソート」レッスンは無料ですか?
はい。「Arrays.sortとソート」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「Arrays.sortとソート」で何を学びますか?
プリミティブ配列とオブジェクト配列をソートします ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Arrays.sortとソート」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。