Цель: Вернуть середину массива(Java)

Рейтинг: 0Ответов: 3Опубликовано: 15.02.2023

Что нужно знать:

  1. Массивы

  2. Класс Arrays.

Задание:

Дан массив произвольной длины. Необходимо вернуть центральную часть массива, при чем, если массив четной длины, то вернуть массив из двух элементов, если нечетной, то вернуть массив из одного элемента.

Пример ввода: {1, 5, 2, 17}

Пример вывода: [5, 2]

Пример ввода: {14, 16, 3}

Пример вывода: [16]

Пример ввода: {}

Пример вывода: []

Требования:

  1. Метод должен быть public static
  2. Сигнатура метода getArrayMiddle(int[] numbers)
  3. Использовать Arrays или System.arrayCopy

Без использование Arrays сделал так и как это можно улучшить

public static int[] getArrayMiddle(int[] numbers) {
    if (numbers.length > 2) {
        if (numbers.length % 2 == 0) {
            int[] arr = new int[2];
            arr[0] = numbers[numbers.length / 2 - 1];
            arr[1] = numbers[numbers.length / 2];
            return arr;
        } else {
            int[] arr1 = new int[1];
            arr1[0] = numbers[numbers.length / 2];
            return arr1;
        }
    } else {
        return numbers;
    }
}

Ответы

▲ 1
public static int[] getArrayMiddle(int[] numbers) {
    int left = (numbers.length - 1) / 2;
    int right = numbers.length == 0 ? 0 : left + 2 - numbers.length % 2;
    return Arrays.copyOfRange(numbers, left, right);
}

И замечание по поводу вашего варианта - возвращать входной массив при длине <= 2 не очень хорошая идея с точки зрения целостности данных, ибо если пользователь поменяет в результирующем массиве значения, то они соответственно изменятся и в исходном массиве.

▲ 0

Да в принципе всё правильно написано.
Улучшить можно только только стиль немного и то - по желанию. Можно уменьшить количество вложенных условий, сделать код более линейным (читабельным). Но на такой маленькой программе - не принципиально.

public static int[] getArrayMiddle(int[] numbers) {
    if (numbers.length <= 2)
        return numbers;

    if (numbers.length % 2 == 0) {
        int[] arr = new int[2];
        arr[0] = numbers[numbers.length / 2 - 1];
        arr[1] = numbers[numbers.length / 2];
        return arr;
    } else {
        int[] arr = new int[1];
        arr[0] = numbers[numbers.length / 2];
        return arr;
    }
}
▲ 0

В принципе для решения такой задачи использование Arrays.copyOfRange не обязательно, так как длина результирующего массива не превышает 2.

Также @Serodv правильно заметил, что для массивов малой длины (1 или 2) следует скопировать их содержимое, а не просто возвращать входной массив.

Дополнительно можно воспользоваться vararg синтаксисом для передачи массива:

public static int[] getMiddle(int ... arr) {
    if (null == arr || arr.length < 1) {
        return arr;
    }
    int mid = arr.length / 2 + arr.length % 2 - 1;
    return arr.length % 2 == 0 ? new int[]{arr[mid], arr[mid + 1]} : new int[]{arr[mid]};
}

Аналогично вариант с System.arraycopy:

public static int[] getMiddle2(int ... arr) {
    if (null == arr || arr.length < 1) {
        return arr;
    }
    int[] res = new int[2 - arr.length % 2];
    System.arraycopy(arr, arr.length / 2 + arr.length % 2 - 1, res, 0, res.length);
    return res;
}

Вариант с Arrays.copyOfRange:

public static int[] getMiddle3(int ... arr) {
    if (null == arr || arr.length < 1) {
        return arr;
    }

    int start = arr.length / 2 + arr.length % 2 - 1;
    int end = start + 2 - arr.length % 2;
    return Arrays.copyOfRange(arr, start, end);
}