Есть ли функция для выполнения кругового сдвига влево в массиве между индексом i и индексом j (оба включительно) в Java - PullRequest
0 голосов
/ 13 марта 2019

Я хочу выполнить круговое смещение влево в массиве между индексом i и индексом j (оба включительно).

Например: рассмотрим массив A, например,

int[] A = {1, 2, 3, 4, 5};

ЕслиЯ хочу выполнить круговое смещение влево в заданном массиве A между 0 (индекс i) и 2 (индекс j), вывод:

A = {2, 3, 1, 4, 5}

Есть ли в Java встроенная функция, которая может выполнять этот типоперации.

Я не спрашиваю о том, как смещать массив влево n раз.Мой вопрос заключается в круговом смещении влево некоторых элементов в массиве, как я показал на примере.

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Да, для него есть встроенная функция: Collections.rotate

Например,

Collections.rotate(Arrays.asList(A).subList(i, j+1), -1);

Обновление:

Это не работает напрямую для примитивных массивов, потому что Arrays.asList не делает бокс для вас. Вам нужно как-то создать Integer[] или List<Integer>, что не очень элегантно.

0 голосов
/ 13 марта 2019

Для коллекций доступно множество манипуляций. Для массивов класс Arrays предоставляет copyOfRange и другие методы, но ничего для операции на месте, как хотелось бы. Вы можете сделать:

int[] a = {1, 2, 3, 4, 5};
final int lwb = 0;
final int upb = 2;

с лямбдой:

int alwb = a[lwb];
Arrays.setAll(a, i -> 
    i < lwb || i > upb ? a[i]
    i < upb -> a[i+1] : alwb
);

Или лучше:

int alwb = a[lwb];
System.arraycopy(a, lwb + 1, a, lwb, upb - lwb - 1);
a[upb] = alwb;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...