微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Collections.reverse() 不支持原始数据类型int、long?

如何解决为什么 Collections.reverse() 不支持原始数据类型int、long?

所以我试图用 Collections.reverse() 来反转一个 int[] 数组。 它对我不起作用。数组以同样的方式打印。

示例:

int[] arr = {1,2,3,4};

Collections.reverse(Arrays.asList(arr));

打印数组后的输出: 1 2 3 4

我一直想知道为什么会这样? 如果我使用 Integer[] 数组而不是 int[],它会完美地反转。 知道为什么会发生这种情况吗?

解决方法

说明

java.util.Collections 类中的方法

public static void reverse(List<?> list) 

反转指定列表中元素的顺序。

参数:
list - 要反转其元素的列表。

上面提到的描述可以在here找到。

对于这个问题,很明显该方法需要传递列表,而不是数组(无论是原始数组还是非原始数组或包装数组)

示例和说明

例如下面的java源让我们将其命名为TestReverse.java

import java.util.*;

public class TestReverse {
    public static void main(String[] args) {
        final int n = 4;
        Integer[] arr = new Integer[n];
        for(var i = 0; i < n; i++) 
            arr[i] = i;
        System.out.println("Initially : " + Arrays.toString(arr));

        Collections.reverse(arr);   // show Complier Error at this point.

        System.out.println("Later : " + Arrays.toString(arr));
    }
}

运行它时,javac -Xdiags:verbose TestReverse.java

以上代码会产生编译器错误

TestReverse.java:10: error: method reverse in class Collections cannot be applied to given types;
        Collections.reverse(arr);
                   ^
  required: List<?>
  found: Integer[]
  reason: argument mismatch; Integer[] cannot be converted to List<?>
1 error

这很明显,因为该方法需要一个列表,但发现它是一个数组(在本例中为整数数组)。

解决方案

如果您仍然想使用该方法并将其反转,则使该数组像一个列表一样工作,这将通过 Arrays.asList(arrayOfAnyType)

因此,反转将是:Collections.reverse(Arrays.asList(arr));
使arr数组颠倒。
这里 Arrays.asList(arr) 的时间为 O(1),Collections.reverse(list) 的时间为 O(1)。

其他替代方法是手动交换元素,无需任何方法的帮助(这也是非常流行的老派类型),其时间复杂度为 O(n),

for(var i = 0; i < arr.length/2; i++) {
    var tmp = arr[i];
    arr[i] = arr[arr.length - (i+1)];
    arr[arr.length - (i+1)] = tmp;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。