1. 概要

このチュートリアルでは、配列を昇順と降順で並べ替える一般的な方法について説明します。

JavaのArraysクラスの並べ替え方法を使用する方法と、独自のコンパレータを実装して配列の値を並べ替える方法について説明します。

2. オブジェクト定義

始める前に、このチュートリアル全体で並べ替えるいくつかの配列を簡単に定義しましょう。 まず、intsの配列と文字列の配列を作成します。

int[] numbers = new int[] { -8, 7, 5, 9, 10, -2, 3 };
String[] strings = new String[] { "learning", "java", "with", "baeldung" };

また、各従業員がidname属性を持つEmployeeオブジェクトの配列を作成しましょう。

Employee john = new Employee(6, "John");
Employee mary = new Employee(3, "Mary");
Employee david = new Employee(4, "David");
Employee[] employees = new Employee[] { john, mary, david };

3. 昇順で並べ替え

Javaのutil.Arrays.sortメソッドは、Compareableインターフェースを昇順で実装するプリミティブまたはオブジェクトの配列をソートするための迅速かつ簡単な方法を提供します。

プリミティブを並べ替える場合、 Arrays.sort メソッドは、Quicksortのデュアルピボット実装を使用します。 ただし、オブジェクトを並べ替える場合は、MergeSortの反復実装が使用されます。

3.1. プリミティブ

プリミティブ配列を昇順で並べ替えるには、配列をsortメソッドに渡します。

Arrays.sort(numbers);
assertArrayEquals(new int[] { -8, -2, 3, 5, 7, 9, 10 }, numbers);

3.2. 同等の実装を行うオブジェクト

Compareable インターフェイスを実装するオブジェクトの場合、プリミティブ配列と同様に、配列をsortメソッドに渡すこともできます。

Arrays.sort(strings);
assertArrayEquals(new String[] { "baeldung", "java", "learning", "with" }, strings);

3.3. 同等のものを実装しないオブジェクト

Employees の配列のように、 Compareable Interfaceを実装していないオブジェクトを並べ替えるには、独自のコンパレータを指定する必要があります。

これは、Java 8で、コンパレータ:内の従業員オブジェクトを比較するプロパティを指定することで非常に簡単に実行できます。

Arrays.sort(employees, Comparator.comparing(Employee::getName));
assertArrayEquals(new Employee[] { david, john, mary }, employees);

この場合、従業員をname属性で並べ替えることを指定しました。

ComparatorのthenComparingメソッドを使用して比較を連鎖させることにより、複数の属性でオブジェクトを並べ替えることもできます。

Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId));

4. 降順で並べ替え

4.1. プリミティブ

Javaはプリミティブ型でのコンパレータの使用をサポートしていないため、プリミティブ配列を降順で並べ替えるのは、昇順で並べ替えるほど簡単ではありません。 この不足を克服するために、いくつかのオプションがあります。

まず、配列を昇順で並べ替えてから、配列のインプレース反転を実行できます。

次に、配列をリストに変換し、 GuavaのLists.reverse()メソッドを使用して、リストを配列に変換し直すことができます。

最後に、配列を Stream に変換してから、int配列にマップし直すことができます。 ワンライナーであり、コアJavaを使用するだけであるという素晴らしい利点があります:

numbers = IntStream.of(numbers).boxed().sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray();
assertArrayEquals(new int[] { 10, 9, 7, 5, 3, -2, -8 }, numbers);

これが機能する理由は、boxedが各intIntegerに変換し、Comparatorを実装するためです。

4.2. 同等の実装を行うオブジェクト

Compareableインターフェイスを実装するオブジェクト配列を降順で並べ替えるのは非常に簡単です。 コンパレータsortメソッドの2番目のパラメーターとして渡すだけです。

Java 8では、コンパレータ.reverseOrder()を使用して、配列を降順でソートすることを指定できます。

Arrays.sort(strings, Comparator.reverseOrder());
assertArrayEquals(new String[] { "with", "learning", "java", "baeldung" }, strings);

4.3. 同等のものを実装しないオブジェクト

比較可能を実装するオブジェクトの並べ替えと同様に、比較定義の最後に reverse()を追加することで、カスタムコンパレータの順序を逆にすることができます。

Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed());
assertArrayEquals(new Employee[] { mary, john, david }, employees);

5. 結論

この記事では、 Arrays.sort メソッドを使用して、プリミティブとオブジェクトの配列を昇順と降順で並べ替える方法について説明しました。

いつものように、この記事のソースコードはGithubにあります。