Укажите массив на другой массив из функции

#java #arrays

#java #массивы

Вопрос:

У меня вопрос о редактировании массивов:

Если я вызываю функцию, которая редактирует элементы массива, например, удваивает все значения, я знаю, что нет необходимости возвращать новый отредактированный массив из функции, потому что при вызове функции я передаю не сам массив, а адрес памяти. Итак, когда функция редактирует массив, она редактирует источник:

 public static void Main(String[] args)
{
    int[] myArray = {1, 2, 3};

    // myArray is now {1, 2, 3}
    arrayDouble(myArray);
    // myArray is now {2, 4, 6}, exactly what I want
}

public static void arrayDouble(int[] arr)
{
    for (int i = 0; i < arr.length; i  )
        arr[i] *= 2;
}
 

Но что, если у меня есть динамический массив, размер которого увеличивается и уменьшается всякий раз, когда пользователь добавляет / удаляет записи. Допустим, у меня есть функция, которая сбрасывает массив до размера 0. Возможно ли сбросить исходный массив без функции возврата, так же, как указано выше?

 public static void Main(String[] args)
{
    int[] myArray = {1, 2, 3};

    // myArray is now {1, 2, 3}
    arrayReset(myArray);
    // myArray is still {1, 2, 3}. Here I want myArray to be {0}
}

public static void arrayReset(int[] arr)
{
    int[] newArr = new int[0];

    arr = newArr;
}
 

В настоящее время я решил проблему таким образом, но я думаю, что это выглядит уродливо и нечисто:

 public static void Main(String[] args)
{
    int[] myArray = {1, 2, 3};

    // myArray is now {1, 2, 3}
    myArray = arrayReset(myArray); // I assign the return value to my array
    // myArray is now {0}, just as I want
}

public static int[] arrayReset(int[] arr)
{
    int[] newArr = new int[1];

    return newArr;
}
 

Комментарии:

1. просто чтобы вы знали, Main в вашей функции должно быть main

2. На самом деле это выглядит довольно чисто, и то, что вы ищете, — это java.util.ArrayList класс

3.Как известно, массивы java имеют фиксированный length . Они не могут увеличиваться или уменьшаться в размерах. Как сказал @MadPhysicist, вы хотите ArrayList .

4. @null_awe sry, это опечатка.

5. @MadPhysicist @ElliottFrisch Полагаю, тогда ответ «нет» =) Я посмотрю ArrayList . Спасибо, ребята!

Ответ №1:

Прежде всего, вы должны следовать рекомендациям.

Рекомендуется не изменять входные элементы метода, т. Е. Ваш метод не должен изменять входной массив и всегда создавать новый. Итак, ваше ugly решение является самым правильным.

 public static int[] arrayReset(int[] arr) {
    int[] res = new int[1];
    // ...
    return res;
}
 

Конечно, вы можете изменить данный массив, например, если вы не хотите / не можете создать новую копию массива. В этом случае вам не нужно извлекать массив (но вы можете), потому что, как вы правильно упомянули, у клиента уже есть ссылка на этот массив. Следующие фрагменты равны:

 public static void arrayReset(int[] arr) {
    // ...
}

public static int[] arrayReset(int[] arr) {
    // ...
    return arr;
}
 

И, наконец. Массив в java является неизменяемым объектом (я имею в виду, что вы не можете изменить его размер). Если вы действительно этого хотите, вы должны использовать либо List<> или array wrapper .

 public static void arrayReset(List<Integer> arr) {
    arr.clear();
}


int[] arr = new int[3];
int[][] wrapper = {arr};
arrayReset(wrapper);
arr = wrapper[0];

// wrapper[0] contains an original array
public static void arrayReset(int[][] wrapper) {
    int[] arr = arrWrapper[0];
    arr = new int[1]; // change array size
    // do smth
    wrapper[0] = arr;
}
 

Комментарии:

1. Спасибо, Олег! Идея обертки была действительно умной! = D