Научитесь разбивать массив в Java разными способами. Мы научимся разбивать массив на равные части, по указанному индексу и одинаковой длины.
1. API Arrays.copyOfRange()
CopyOfRange() создает новый массив того же типа, что и исходный массив, и содержит элементы указанного диапазона исходного массива в новом массиве. Обратите внимание, что этот метод внутренне использует System.arraycopy() для копирования элементов массива.
public static T[] copyOfRange(T[] original, int from, int to)
Это параметры метода.
- оригинал – массив, из которого необходимо скопировать диапазон
- from – начальный индекс диапазона, который необходимо скопировать, включительно
- to – конечный индекс диапазона, который необходимо скопировать, исключая его.(Этот индекс может находиться за пределами массива.)
Важно отметить, что индекс может лежать за пределами длины массива. Такие индексные позиции заполняются значением по умолчанию типа массива.
Например, для типов int, long и double дополнительные индексы будут заполнены нулями. Для булевого массива такие индексы будут заполнены false, а для массивов объектов такие позиции будут заполнены null.
Он выдаст исключение IllegalArgumentException, если from больше, чем to.
2. Разделение массива по указанному индексу
Допустим, мы делим массив таким образом, что должны получить два массива определенной длины. В таком случае мы должны использовать API copyOfRange() для создания двух новых массивов из исходного массива.
Первый новый массив будет содержать элементы, начиная с нуля до указанного индекса, а второй новый массив будет содержать элементы от указанного индекса до конца исходного массива.
int[] original = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int givenIndex = 3;splitArrayPart1 = Arrays.copyOfRange(original, 0, givenIndex);splitArrayPart2 = Arrays.copyOfRange(original, givenIndex, original.length);System.out.println(Arrays.toString(splitArrayPart1)); //[0, 1, 2]System.out.println(Arrays.toString(splitArrayPart2)); //[3, 4, 5, 6, 7, 8, 9]
2. Разделение массива на две равные части
Разделение массива пополам очень похоже на первый пример. Нам нужно только найти позицию разделения самостоятельно, и это будет середина массива.
int[] original = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int splitSize = original.length / 2;int[] splitArrayPart1 = Arrays.copyOfRange(original, 0, splitSize);int[] splitArrayPart2 = Arrays.copyOfRange(original, splitSize, original.length);System.out.println(Arrays.toString(splitArrayPart1)); //[0, 1, 2, 3, 4]System.out.println(Arrays.toString(splitArrayPart2)); //[5, 6, 7, 8, 9]
3. Разбиение массива на N частей
Это немного сложно. Здесь нам нужно перебрать длину массива, но частями с указанным числом. Затем нам нужно использовать метод copyOfRange() для создания новых экземпляров массива из этих скопированных элементов.
Мы должны быть особенно внимательны, если после разделения массива поровну остались элементы. Нам нужно создать новый массив из этих оставшихся элементов.
Например, наш исходный массив содержит 10 элементов. Если мы попытаемся разделить массив таким образом, что любой новый массив не должен содержать более 3 элементов. Таким образом, в этом случае после процедуры разделения будет 4 массива. 3 массива будут иметь по 3 элемента каждый, а 4-й массив будет иметь только один элемент.
Ниже представлен метод, который выполняет всю описанную выше работу.
public static <T extends Object> List<T[]> splitArray(T[] array, int splitSize) {int numberOfArrays = array.length / splitSize;int remainder = array.length % splitSize;int start = 0;int end = 0;List<T[]> list = new ArrayList<T[]>();for(int i = 0; i < numberOfArrays; i++) {end += splitSize;list.add(Arrays.copyOfRange(array, start, end));start = end;}if(remainder > 0) {list.add(Arrays.copyOfRange(array, start,(start + remainder)));}return list;}
Давайте проверим этот метод с нашим исходным массивом и разделим его так, чтобы в массиве было не более 3 элементов.
List<Integer[]> arrayParts = splitArray(ArrayUtils.toObject(original), 3);for(Integer[] o: arrayParts) {System.out.println(Arrays.toString(o));}//Output[0, 1, 2][3, 4, 5][6, 7, 8][9]
4. Заключение
В этом уроке мы научились разделять массив в Java для различных вариантов использования. Мы научились использовать API Arrays.copyOfRange() для разделения массивов на любое количество частей.
Существуют и другие способы разделения массива, например, преобразование массива в список и разделение списка. Такие методы создают ненужные временные переменные, не давая явного преимущества.