1概要

このチュートリアルでは、https://www.baeldung.com/java-arrays-guide[arrays]を昇順および降順に並べ替える一般的な方法について説明します。

Javaのhttps://www.baeldung.com/java-util-arrays[

Arrays

]クラスの並べ替え方法を使用し、配列の値を順序付けるために独自の

Comparator

を実装することを検討します。

2.オブジェクト定義

始める前に、このチュートリアルを通してソートするいくつかの配列を簡単に定義しましょう。まず、

ints

の配列と文字列の配列を作成します。

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

そして、各従業員が

__id





name


attributeを持つ


Employee

__objectsの配列も作成しましょう。

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のhttps://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-byte:A-[

util.Arrays.sort

]メソッドを使用すると、すばやく簡単な方法で簡単にデータを取得できます。

Comparable

インタフェースを実装するプリミティブまたはオブジェクトの配列を昇順で並べ替えます。

  • プリミティブをソートするとき、

    __Arrays.sort

    __methodはhttps://www.baeldung.com/java-quicksort[Quicksort]のデュアルピボット実装を使用します。

ただし、オブジェクトをソートするときは、https://www.baeldung.com/java-merge-sort[MergeSort]の反復実装が使用されます。

3.1. プリミティブ

プリミティブ配列を昇順にソートするには、配列を

__sort

__methodに渡します。

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

3.2. 同等のものを実装するオブジェクト

プリミティブ配列と同様に、

__Comparable


interfaceを実装するオブジェクトの場合は、単に配列を

sort__メソッドに渡すこともできます。

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

3.3. 同等に実装されていないオブジェクト


Employees

の配列のように、

__Comparable

__Interfaceを実装していないオブジェクトをソートするには、独自のコンパレータを指定する必要があります。


Comparator内で


Employee


_

_オブジェクトを比較したいプロパティーを指定することによって、Java 8でこれを非常に簡単に行うことができます。

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

この場合は、従業員を

__name

__attributesで注文することを指定しました。


  • __Comparatorのhttps://www.baeldung.com/java-8-comparator-comparing[thenComparing]

    __methodを使用して比較を連鎖することで、オブジェクトを複数の属性に分類することもできます。

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

4.降順でソートする

4.1. プリミティブ

プリミティブ配列を降順でソートすることは、Javaがプリミティブ型で____Comparatorsを使用することをサポートしていないため、昇順でソートすることほど単純ではありません。この不足を克服するために、いくつかの選択肢があります。

まず、配列を昇順にソートしてから、配列のインプレース反転を行うことができます。

次に、配列をリストに変換し、

Guavaのhttps://www.baeldung.com/guava-lists[

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

がそれぞれの

int



Integer

に変換し、それが__Comparatorを実装するからです。

4.2. 同等のものを実装するオブジェクト


__Comparable


インタフェースを実装しているオブジェクト配列を降順にソートするのは非常に簡単です。実行する必要があるのは、

sort

メソッドの2番目のパラメーターとして


Comparator

__を渡すことだけです。

  • Java 8では、

    __Comparator.reverseOrder()

    __を使用して、配列を降順にソートすることを示します。

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

4.3. 同等に実装されていないオブジェクト

比較を実装するオブジェクトをソートするのと同様に、比較定義の最後に

__reversed()を追加することで、カスタムの

__Comparatorの順序を逆にすることができます。

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


5結論

この記事では、

Arrays.sort

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

いつものように、この記事のソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-arrays[Githubに掲載]にあります。