为什么 Collections.reverse() 不支持原始数据类型(int、long)?
Why doesn't Collections.reverse() support primitive datatypes (int, long)?
所以我试图用 Collections.reverse() 反转一个 int[] 数组。
它不适合我。数组以相同的方式打印。
示例:
int[] arr = {1, 2, 3 ,4};
Collections.reverse(Arrays.asList(arr));
打印数组后的输出:
1 2 3 4
我一直想知道为什么会这样?
如果我使用 Integer[] 数组而不是 int[],它会完全反转。
知道为什么会这样吗?
描述
方法来自java.util.Collectionsclass
public static void reverse(List<?> list)
Reverses the order of the elements in the specified list.
Parameters:
list - the list whose elements are to be reversed.
上面提到的描述可以找到here。
对于这个问题,很明显该方法需要传递列表,而不是数组(无论是原始数组还是非原始数组或包装数组)
示例和解释
下面的例子java source 让我们把它命名为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;
}
所以我试图用 Collections.reverse() 反转一个 int[] 数组。 它不适合我。数组以相同的方式打印。
示例:
int[] arr = {1, 2, 3 ,4};
Collections.reverse(Arrays.asList(arr));
打印数组后的输出: 1 2 3 4
我一直想知道为什么会这样? 如果我使用 Integer[] 数组而不是 int[],它会完全反转。 知道为什么会这样吗?
描述
方法来自java.util.Collectionsclass
public static void reverse(List<?> list)
Reverses the order of the elements in the specified list.
Parameters:
list - the list whose elements are to be reversed.
上面提到的描述可以找到here。
对于这个问题,很明显该方法需要传递列表,而不是数组(无论是原始数组还是非原始数组或包装数组)
示例和解释
下面的例子java source 让我们把它命名为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;
}