Collections.rotate()作为Java中arraylist的副本

时间:2019-07-06 14:13:47

标签: java arraylist collections

    ArrayList<Integer> obj = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
    Collections.rotate(obj,+1);
    Collections.rotate(obj,+2);

如果我使用集合旋转arrayList,它将旋转原始数组。 我需要旋转特定的索引并将其保存在下一个索引/所需索引中,而又不影响原始索引吗?

就像下面一样,都在同一阵列中

input:  
1
2
3
4
5
output: 
1  5  4
2  1  5
3  2  1
4  3  2
5  4  3

现在我正在做这样的事情,如下

ArrayList<Integer> arraySec = new ArrayList<Integer>();
ArrayList<Integer> arrayThrd = new ArrayList<Integer>();
arraySec.addAll(obj);
Collections.rotate(arraySec,+1);
arrayThrd.addAll(arraySec);
Collections.rotate(arrayThrd,+1);

因为这个原因,每个索引需要很多数组,所以要超过5个数组。旋转并作为其副本而不是原始副本的其他任何方式

1 个答案:

答案 0 :(得分:0)

如果Collections.rotate方法未返回原始列表的新副本,请自己编写一个!

static <T> ArrayList<T> rotate(ArrayList<T> list, int distance) {
    ArrayList<T> newList = new ArrayList<>(list);
    Collections.rotate(newList, distance);
    return newList;
}

您可以像这样使用它来打印所需的输出:

    ArrayList<Integer> obj = new ArrayList<>(Arrays.asList(3,6,4,1,9));
    List<ArrayList<Integer>> listOfArrayLists =
            IntStream.range(0, obj.size()) // replace obj.size() with however many rotations you want
            .mapToObj(x -> rotate(obj, x))
                    .collect(Collectors.toList());
    for (int i = 0 ; i < listOfArrayLists.get(0).size() ; i++) {
        for (ArrayList<Integer> listOfArrayList : listOfArrayLists) {
            System.out.print(listOfArrayList.get(i));
            System.out.print(" ");
        }
        System.out.println();
    }

如果您实际上想以这种“转置”方式打印 all 阵列列表的旋转,那么您实际上并不需要这么多新的阵列列表!如果尚未注意到,则输出的第一行与将输入数组列表反转并旋转1的相同。第二行是将输入反转并旋转2的输入,依此类推。因此,这将产生完全相同的结果:

    Collections.reverse(obj);
    for (int i = 0 ; i < obj.size() ; i++) {
        Collections.rotate(obj, 1);
        for (Integer j : obj) {
            System.out.print(j);
            System.out.print(" ");
        }
        System.out.println();
    }