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

时间:2010-05-08 17:18:24

标签: java arrays list collections

我有以下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]); }
    }

}

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

1
2
3
4
5

为什么会这样?

还有替代解决方案吗?

编辑:

这样可行:

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)); }
    }

}

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

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

1 个答案:

答案 0 :(得分:19)

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

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

让我们尝试不同的东西:

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

如您所见,带有int[]的varargs无法按预期方式工作,编译器会出错。 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]"

更多解释

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

请考虑以下代码段:

    System.out.println(Arrays.asList(1,2,3));
    // prints "[1, 2, 3]"

这里发生的是每个int被装入Integer,varargs机制“有效”,asList创建一个包含3个元素的列表。现在考虑以下形式:

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

现在asList的参数是int[]T不能是int,因此T... varargs机制“失败”,而asList只获得一个元素,而且它是int[],而不是int值本身。

现在考虑这种形式:

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

既然Integer[]T...asList会按预期获得3个元素。

另见