java 反转数组
本文我们看看在java中如何反转数组。有多种方式可以实现,纯java8方式——原数组不变并创建新的数组。
然后,我们看看利用第三方库实现——Apache Commons Lang及Guava。
提出问题
需求是反转数组元素的顺序,所以如果给定数组:
fruits = {"apples", "tomatoes", "bananas", "guavas", "pineapples"}
我们希望得到:
invertedFruits = {"pineapples", "guavas", "bananas", "tomatoes", "apples"}
下面看集中实现方式.
使用传统的循环实现
第一种方式,你可能想到循环方式:
void invertUsingFor(Object[] array) {
for (int i = 0; i < array.length / 2; i++) {
Object temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
}
上面代码中,迭代数组的一半,改变对称位置的元素。
我们使用了临时变量,确保在迭代过程中不丢失当前位置的值。
使用java 8 Stream API
我们也可以使用Stream API实现:
Object[] invertUsingStreams(Object[] array) {
return IntStream.rangeClosed(1, array.length)
.mapToObj(i -> array[array.length - i])
.toArray();
}
这里我们使用IntStream.range方法生成连续的数字流,然后我们按照倒叙方式映射这个序列至数组索引。
使用Collections.reverse()方法
使用Collections.reverse()方法可以很简单实现。
public void invertUsingCollectionsReverse(Object[] array) {
List<Object> list = Arrays.asList(array);
Collections.reverse(list);
}
与前面方法相比,这种方式可读性最好。
使用Apache Commons Lang
使用Apache Commons Lang也可以轻松实现:
public void invertUsingCommonsLang(Object[] array) {
ArrayUtils.reverse(array);
}
这种方法相当简单。对应依赖为,读者可以自己确定相应版本:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
使用Google Guava
还可以使用Google Guava,对应依赖为,确认相应版本。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
利用Lists类的reverse可实现:
public Object[] invertUsingGuava(Object[] array) {
List<Object> list = Arrays.asList(array);
List<Object> reversed = Lists.reverse(list);
return reversed.toArray();
}
总结
本文我们看了几种不同的方式实现反转数组。包括纯java方式的三种实现,以及两种第三方库方式实现。