Есть массив int[10000]
. Нужно сдвинуть каждый элемент на 360 ячеек назад, при этом элементы [0-359]
должны перенестись из начала в конец массива.
Написал алгоритм, но что-то подсказывает, что это ненужный велосипед, который к тому же и занимает много времени.
Если ли какая-то стандартная функция в Java, которая позволяет сделать это быстро, или необходимо самому писать цикл?
Можно поступить так:
Arrays.copyOf
)System.arraycopy
)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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь поключить кастомный шрифт на странице через файл _Layoutcshtml