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.14.0</version>
</dependency>

你可以在这里找到该库的最新版本:这里

3. ArrayUtils

ArrayUtils 类提供了处理数组的实用方法。这些方法会优雅地处理输入,当传入null值时不会抛出异常。

本节将展示ArrayUtils类中定义的一些方法。请注意,所有这些方法都适用于任何类型的元素。

为了方便起见,还定义了针对包含基本类型数组的重载版本。

4. addaddAll

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. removeremoveAll

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. removeElementremoveElements

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. removeAllOccurrences API

removeAllOccurrences 方法从给定数组中移除所有指定元素的所有出现。

如果给定数组中不存在该元素,移除操作将被忽略,而不是抛出异常:

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. 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(不包括)之间的所有元素向右移动一位,并确认结果:

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);

请注意,如果传递的索引大于数组长度,它会被降低到数组长度,而不是引发异常。同样,如果传递负索引,它会被提升为0。

12. swap API

swap 方法交换给定数组中指定位置的一系列元素。

以下代码片段交换两个从索引0和3开始的元素组,每个组包含两个元素:

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

如果没有传递长度参数,每个位置上的单个元素将被交换:

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项目中找到。