#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