Collections.rotate () как копия массива в Java - PullRequest
1 голос
/ 06 июля 2019
    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 голосов
/ 06 июля 2019

Если метод 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();
    }

Если вы действительно хотите напечатать все повороты списка массивов таким «транспонированным» способом, тогда вам на самом деле не нужно столько новых списков массивов! Если вы еще не заметили, первая строка выходных данных совпадает со списком входных массивов, повернутых на 1 и повернутыми на 1. Вторая строка представляет собой входные данные, повернутые на 2 и повернутые на 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...