Сдвиг ячеек массива

439
23 мая 2017, 01:08

Есть массив int[10000]. Нужно сдвинуть каждый элемент на 360 ячеек назад, при этом элементы [0-359] должны перенестись из начала в конец массива.
Написал алгоритм, но что-то подсказывает, что это ненужный велосипед, который к тому же и занимает много времени.
Если ли какая-то стандартная функция в Java, которая позволяет сделать это быстро, или необходимо самому писать цикл?

Answer 1

Можно поступить так:

  • Сделать копию первых 360 элементов (Arrays.copyOf)
  • Сдвинуть элементы в массиве на 360 влево (System.arraycopy)
  • Вставить копию в последние 360 элементов (System.arraycopy)

Итоговый код:

final int shift = 360;
int[] array = IntStream.range(0, 10000).toArray();
int[] copy = Arrays.copyOf(array, shift);
System.arraycopy(array, shift, array, 0, array.length - shift);
System.arraycopy(copy, 0, array, array.length - shift, shift);

Можно также рассмотреть варианты с использованием Collections.rotate:

List<Integer> list = IntStream.of(array).boxed().collect(Collectors.toList());
Collections.rotate(list, -shift);
array = list.stream().mapToInt(e -> e).toArray();

и просто IntStream:

array = stream(array);
private static int[] stream(int[] array, int shift)
{
    return IntStream.concat(
                IntStream.range(shift, array.length),
                IntStream.range(0, shift)
            )
            .map(e -> array[e])
            .toArray();
}

Однако по производительности эти варианты уступают первому.

Массив из 10 миллионов чисел:

arraycopy       5ms
collections   410ms
intstream      35ms

Массив из 100 миллионов чисел:

arraycopy      40ms
collections 20000ms
intstream     190ms
READ ALSO
Вопрос про сжатие из c++ в java

Вопрос про сжатие из c++ в java

Помогите переделать метод из c++ в java

283
Запуск tomcat из пользователя с паролем

Запуск tomcat из пользователя с паролем

Я пытаюсь запустить сервер но получаю такую ошибку

337
Подключить кастомный шрифт ASP.NET MVC

Подключить кастомный шрифт ASP.NET MVC

Пытаюсь поключить кастомный шрифт на странице через файл _Layoutcshtml

552