Javaでの配列の並べ替え
1. 概要
2. オブジェクト定義
始める前に、このチュートリアル全体で並べ替えるいくつかの配列を簡単に定義しましょう。 まず、intsの配列と文字列の配列を作成します。
int[] numbers = new int[] { -8, 7, 5, 9, 10, -2, 3 };
String[] strings = new String[] { "learning", "java", "with", "example" };
また、各従業員が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のutil.Arrays.sortメソッドは、Comparableインターフェースを昇順で実装するプリミティブまたはオブジェクトの配列をソートするための迅速かつ簡単な方法を提供します。
プリミティブを並べ替えるとき、Arrays.sort メソッドはQuicksortのデュアルピボット実装を使用します。 ただし、オブジェクトを並べ替えるときは、MergeSortの反復実装が使用されます。
3.1. プリミティブ
プリミティブ配列を昇順で並べ替えるには、配列をsort メソッドに渡します。
Arrays.sort(numbers);
assertArrayEquals(new int[] { -8, -2, 3, 5, 7, 9, 10 }, numbers);
3.2. Comparableを実装するオブジェクト
プリミティブ配列と同様に、Comparable interfaceを実装するオブジェクトの場合、配列をsortメソッドに渡すこともできます。
Arrays.sort(strings);
assertArrayEquals(new String[] { "example", "java", "learning", "with" }, strings);
3.3. 同等のものを実装しないオブジェクト
Employeesの配列のように、Comparable Interfaceを実装していないオブジェクトを並べ替えるには、独自のコンパレータを指定する必要があります。
Java 8では、Comparator:内でEmployee オブジェクトを比較するプロパティを指定することで、これを非常に簡単に行うことができます。
Arrays.sort(employees, Comparator.comparing(Employee::getName));
assertArrayEquals(new Employee[] { david, john, mary }, employees);
この場合、従業員をname 属性で並べ替えることを指定しました。
Comparator’s thenComparing methodを使用して比較を連鎖させることにより、複数の属性でオブジェクトを並べ替えることもできます。
Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId));
4. 降順で並べ替える
4.1. プリミティブ
Javaはプリミティブ型のComparators onの使用をサポートしていないため、プリミティブ配列を降順で並べ替えるのは、昇順で並べ替えるほど簡単ではありません。 この不足を克服するために、いくつかのオプションがあります。
まず、配列のsort our array in ascending order and then do an in-place reversalを作成できます。
次に、配列をリストuse Guava’s Lists.reverse() methodに変換してから、リストを配列に戻すことができます。
最後に、配列をStream に変換してから、int配列にマップし直すことができます。 a one-liner and just using core 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に変換し、doesがComparator.を実装するためです。
4.2. Comparableを実装するオブジェクト
Comparable interfaceを実装するオブジェクト配列を降順で並べ替えるのは非常に簡単です。 必要なのは、sortメソッドの2番目のパラメータとしてComparator を渡すことだけです。
Java 8では、Comparator.reverseOrder() を使用して、配列を降順でソートすることを示すことができます。
Arrays.sort(strings, Comparator.reverseOrder());
assertArrayEquals(new String[] { "with", "learning", "java", "example" }, strings);
4.3. 同等のものを実装しないオブジェクト
比較可能なものを実装するオブジェクトの並べ替えと同様に、比較定義の最後にreversed() を追加することで、カスタムComparator の順序を逆にすることができます。
Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed());
assertArrayEquals(new Employee[] { mary, john, david }, employees);
5. 結論
この記事では、Arrays.sortメソッドを使用して、プリミティブとオブジェクトの配列を昇順と降順で並べ替える方法について説明しました。
いつものように、この記事のソースコードはover on Githubにあります。