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