带有数组的Java Collections.rotate()不起作用

ste*_*_72 8 java arrays collections list

我有以下Java代码:

import java.util.Arrays;
import java.util.Collections;

public class Test {
    public static void main(String[] args) {
        int[] test = {1,2,3,4,5};
        Collections.rotate(Arrays.asList(test), -1);
        for(int i = 0; i < test.length; i++) { System.out.println(test[i]); }
    }

}
Run Code Online (Sandbox Code Playgroud)

我想要旋转数组,但我得到的输出是

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

还有替代解决方案吗?

编辑:

这样可行:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        int[] test = {1,2,3,4,5};
        List<Integer> testList = new ArrayList<Integer>();
        for(int i = 0; i < test.length; i++) { testList.add(test[i]); }
        Collections.rotate(testList, -1);
        for(int i = 0; i < test.length; i++) { System.out.println(testList.get(i)); }
    }

}
Run Code Online (Sandbox Code Playgroud)

但是Arrays.asList应该返回一个列表,当写入时,将更改复制到数组.有没有办法解决这个问题,而无需手动进行从数组到列表的转换?

我(认为我)不能浪费那么多CPU时间和内存来进行转换.

pol*_*nts 21

这是一个棘手的问题:是的,asList支持List它返回数组,并更改为List将"直写"到数组.但是,由于T...在这种情况下varargs如何与基本类型的数组进行交互,实际上你创建了一个包含1个元素的列表!

    int[] test = {1,2,3,4,5};
    System.out.println(Arrays.asList(test).size());
    // prints "1"
Run Code Online (Sandbox Code Playgroud)

让我们尝试不同的东西:

    int[] test = {1,2,3,4,5};
    List<Integer> list = Arrays.asList(test);
    // "Type mismatch: cannot convert from List<int[]> to List<Integer>"
Run Code Online (Sandbox Code Playgroud)

如您所见,带有a的varargs int[]无法按预期方式工作,编译器会出错.Arrays.asList实际上返回1元素List<int[]>而不是5元素List<Integer>.

使用Integer[]而不是int[]按预期工作:

    Integer[] test = {1,2,3,4,5};
    Collections.rotate(Arrays.asList(test), -1);
    System.out.println(Arrays.toString(test));
    // prints "[2, 3, 4, 5, 1]"
Run Code Online (Sandbox Code Playgroud)

更多解释

完整的签名asList<T> List<T> Arrays.asList(T... a).请注意,在这种情况下T不能int出于同样的原因,因为您不能拥有List<int>Java:T需要是引用类型.

请考虑以下代码段:

    System.out.println(Arrays.asList(1,2,3));
    // prints "[1, 2, 3]"
Run Code Online (Sandbox Code Playgroud)

这里发生的是每个都int被装入一个Integer,并且varargs机制"工作"并asList创建一个包含3个元素的列表.现在考虑以下形式:

    System.out.println(Arrays.asList(new int[] { 1,2,3 }));
    // prints "[[I@xxxxxx]"
Run Code Online (Sandbox Code Playgroud)

现在的争论asList是一个int[].T不能是一个int,因此,T...可变参数机制"失败",并且asList只得到一个元素,它是一个int[],而不是int值本身.

现在考虑这个形式:

    System.out.println(Arrays.asList(new Integer[] { 1,2,3 }));
    // prints "[1, 2, 3]"
Run Code Online (Sandbox Code Playgroud)

现在既然Integer[]是a T...,asList按预期得到3个元素.

也可以看看