如何解决为什么 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 举报,一经查实,本站将立刻删除。