Apache Commons Lang 3を使った配列処理

1概要

Apache Commons Lang 3 ライブラリは、Java APIのコアクラスの操作をサポートします。このサポートには、文字列、数値、日付、並行性、オブジェクトの反映などを処理するためのメソッドが含まれています。

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

2 Mavenの依存関係

Commons Lang 3ライブラリを使用するには、次の依存関係を使用して中央のMavenリポジトリからそれを引っ張るだけです。

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

このライブラリの最新版を見つけることができます。 22[ここ]

3 ArrayUtils

ArrayUtils クラスは、配列を操作するためのユーティリティメソッドを提供します。

これらのメソッドは、 null 値が渡されたときに例外がスローされないようにして、入力を適切に処理しようとします。

このセクションでは、 ArrayUtils クラスで定義されているいくつかのメソッドについて説明します。

これらのメソッドはすべてどの要素タイプでも機能することに注意してください。

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

4 add addAll

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

次のコードは、 oldArray 配列の最初の位置に数値0を挿入し、結果を検証します。

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 contains 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 __リバース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 subarray 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);

length引数が渡されない場合は、各位置にある要素が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 のコア配列処理ユーティリティを紹介します。

いつものように、上記の例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[GitHubプロジェクト]にあります。