1. 概要

Apache Commons Lang 3 ライブラリは、JavaAPIのコアクラスの操作をサポートします。 このサポートには、文字列、数値、日付、同時実行性、オブジェクトリフレクションなどを処理するためのメソッドが含まれます。

このクイックチュートリアルでは、非常に便利なArrayUtilsユーティリティクラスを使用した配列処理に焦点を当てます。

2. Mavenの依存関係

Commons Lang 3ライブラリを使用するには、次の依存関係を使用して中央のMavenリポジトリからライブラリをプルします。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

このライブラリの最新バージョンはここにあります。

3. ArrayUtils

ArrayUtils クラスは、配列を操作するためのユーティリティメソッドを提供します。 これらのメソッドは、 null 値が渡されたときに例外がスローされないようにすることで、入力を適切に処理しようとします。

このセクションでは、ArrayUtilsクラスで定義されているいくつかのメソッドについて説明します。 これらのメソッドはすべて、任意の要素タイプで機能することに注意してください。

便宜上、それらのオーバーロードされたフレーバーは、プリミティブ型を含む配列を処理するためにも定義されています。

4. addおよびaddAll

add メソッドは、指定された配列をコピーし、指定された要素を新しい配列の指定された位置に挿入します。 位置が指定されていない場合、新しい要素が配列の最後に追加されます。

次のコードフラグメントは、 oldArray 配列の最初の位置に数値ゼロを挿入し、結果を検証します。

int[] oldArray = { 2, 3, 4, 5 };
int[] newArray = ArrayUtils.add(oldArray, 0, 1);
int[] expectedArray = { 1, 2, 3, 4, 5 };
 
assertArrayEquals(expectedArray, newArray);

位置が指定されていない場合、oldArrayの最後に追加の要素が追加されます。

int[] oldArray = { 2, 3, 4, 5 };
int[] newArray = ArrayUtils.add(oldArray, 1);
int[] expectedArray = { 2, 3, 4, 5, 1 };
 
assertArrayEquals(expectedArray, newArray);

addAll メソッドは、指定された配列の最後にすべての要素を追加します。 次のフラグメントは、この方法を示し、結果を確認します。

int[] oldArray = { 0, 1, 2 };
int[] newArray = ArrayUtils.addAll(oldArray, 3, 4, 5);
int[] expectedArray = { 0, 1, 2, 3, 4, 5 };
 
assertArrayEquals(expectedArray, newArray);

5. removeおよびremoveAll

remove メソッドは、指定された配列から指定された位置にある要素を削除します。 後続のすべての要素は左にシフトされます。 これはすべての削除操作に当てはまることに注意してください。

このメソッドは、元の配列に変更を加える代わりに、新しい配列を返します。

int[] oldArray = { 1, 2, 3, 4, 5 };
int[] newArray = ArrayUtils.remove(oldArray, 1);
int[] expectedArray = { 1, 3, 4, 5 };
 
assertArrayEquals(expectedArray, newArray);

removeAll メソッドは、指定された配列から指定された位置にあるすべての要素を削除します。

int[] oldArray = { 1, 2, 3, 4, 5 };
int[] newArray = ArrayUtils.removeAll(oldArray, 1, 3);
int[] expectedArray = { 1, 3, 5 };
 
assertArrayEquals(expectedArray, newArray);

6. removeElementおよびremoveElements

removeElement メソッドは、指定された配列から指定された要素の最初の出現を削除します。

例外をスローする代わりに、そのような要素が指定された配列に存在しない場合、削除操作は無視されます。

int[] oldArray = { 1, 2, 3, 3, 4 };
int[] newArray = ArrayUtils.removeElement(oldArray, 3);
int[] expectedArray = { 1, 2, 3, 4 };
 
assertArrayEquals(expectedArray, newArray);

removeElements メソッドは、指定された配列から指定された要素の最初の出現を削除します。

指定された要素が指定された配列に存在しない場合、例外をスローする代わりに、削除操作は無視されます。

int[] oldArray = { 1, 2, 3, 3, 4 };
int[] newArray = ArrayUtils.removeElements(oldArray, 2, 3, 5);
int[] expectedArray = { 1, 3, 4 };
 
assertArrayEquals(expectedArray, newArray);

7. removeAllOccurences API

removeAllOccurences メソッドは、指定された配列から指定された要素のすべてのオカレンスを削除します。

例外をスローする代わりに、そのような要素が指定された配列に存在しない場合、削除操作は無視されます。

int[] oldArray = { 1, 2, 2, 2, 3 };
int[] newArray = ArrayUtils.removeAllOccurences(oldArray, 2);
int[] expectedArray = { 1, 3 };
 
assertArrayEquals(expectedArray, newArray);

8. にはAPIが含まれています

contains メソッドは、指定された配列に値が存在するかどうかをチェックします。 結果の検証を含むコード例を次に示します。

int[] array = { 1, 3, 5, 7, 9 };
boolean evenContained = ArrayUtils.contains(array, 2);
boolean oddContained = ArrayUtils.contains(array, 7);
 
assertEquals(false, evenContained);
assertEquals(true, oddContained);

9. reverse API

reverse メソッドは、指定された配列の指定された範囲内で要素の順序を逆にします。 このメソッドは、新しい配列を返す代わりに、渡された配列に変更を加えます。

簡単に見てみましょう:

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(originalArray, 1, 4);
int[] expectedArray = { 1, 4, 3, 2, 5 };
 
assertArrayEquals(expectedArray, originalArray);

範囲が指定されていない場合、すべての要素の順序が逆になります。

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(originalArray);
int[] expectedArray = { 5, 4, 3, 2, 1 };
 
assertArrayEquals(expectedArray, originalArray);

10. shift API

shift メソッドは、指定された配列内の一連の要素をいくつかの位置にシフトします。 このメソッドは、新しい配列を返す代わりに、渡された配列に変更を加えます。

次のコードフラグメントは、インデックス1(包括的)とインデックス4(排他的)の要素間ですべての要素を1つ右にシフトし、結果を確認します。

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.shift(originalArray, 1, 4, 1);
int[] expectedArray = { 1, 4, 2, 3, 5 };
 
assertArrayEquals(expectedArray, originalArray);

範囲の境界が指定されていない場合、配列のすべての要素がシフトされます。

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.shift(originalArray, 1);
int[] expectedArray = { 5, 1, 2, 3, 4 };
 
assertArrayEquals(expectedArray, originalArray);

11. サブアレイAPI

subarray メソッドは、指定された配列の指定された範囲内の要素を含む新しい配列を作成します。 以下は、結果のアサーションの例です。

int[] oldArray = { 1, 2, 3, 4, 5 };
int[] newArray = ArrayUtils.subarray(oldArray, 2, 7);
int[] expectedArray = { 3, 4, 5 };
 
assertArrayEquals(expectedArray, newArray);

渡されたインデックスが配列の長さよりも大きい場合、メソッドに例外をスローさせるのではなく、配列の長さに降格されることに注意してください。 同様に、負のインデックスが渡されると、ゼロにプロモートされます。

12. swap API

swap メソッドは、指定された配列の指定された位置にある一連の要素を交換します。

次のコードフラグメントは、インデックス0と3から始まる要素の2つのグループを交換し、各グループには2つの要素が含まれています。

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.swap(originalArray, 0, 3, 2);
int[] expectedArray = { 4, 5, 3, 1, 2 };
 
assertArrayEquals(expectedArray, originalArray);

長さ引数が渡されない場合、各位置の1つの要素のみがスワップされます。

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.swap(originalArray, 0, 3);
int[] expectedArray = { 4, 2, 3, 1, 5 };
assertArrayEquals(expectedArray, originalArray);

13. 結論

このチュートリアルでは、Apache Commons Lang 3のコア配列処理ユーティリティ– ArrayUtilsを紹介します。

いつものように、上記のすべての例とコードスニペットの実装は、GitHubプロジェクトにあります。