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方式的三种实现,以及两种第三方库方式实现。