Как передать массив в функцию вместо значений в ней в Java
У меня есть функция, которая принимает четыре двойных, и у меня есть массив из четырех двойных. Есть ли способ, которым я могу просто передать массив в функцию? Например:
РЕДАКТИРОВАТЬ: Когда я говорю myFunc(myArray) , я имею в виду «есть ли какой-нибудь формат, который встроен в Java, чтобы позволить мне сделать что-то, что было бы равным этому?» Извините за неясность об этом 🙁
3 ответа
myFunc(myArray[0], myArray[1], myArray[2], myArray[3]); // Do I have to do this?
Нет, но ты бы хотел, чтобы ты это сделал.
Вот упрощенный пример для нерасширенных, коробочных типов, использующих отражение. Если вы также хотите поддерживать примитивные типы, вы можете добавить переопределение call для каждого такого типа:
Это намного медленнее и более подвержено ошибкам, чем на ваш взгляд, но оно как бы позволяет вам делать то, что вы хотите.
Почему Java делает это трудным?
Это концептуально проблемная операция. Вы пытаетесь применить динамическую диспетчеризацию к статически типизированному языку со статической диспетчеризацией. На обычные проверки загрузки компилятора и класса больше нельзя полагаться. Система не может диспетчеризировать или JIT так эффективно, и программисту приходится иметь дело с большим количеством ошибок ввода во время выполнения.
Языки, которые позволяют это легко (например, Lisp или JavaScript), обычно испытывают недостаток в перегрузке методов и в любом случае передают аргументы в виде списков, и поэтому не страдают так сильно.
Что я должен был сделать вместо этого?
Если вы хотите разрешить вызов myFunc либо с серией значений типа double, либо с массивом, вы должны были сделать это вариативным.
Это похоже на то, что программист вызывает myFunc , но облегчает жизнь, позволяя Java выполнять статическую диспетчеризацию и позволяя разработчику myFunc решать, как обрабатывать переменное число аргументов.
Вы можете передать объект — myArray в ваш метод, а затем прочитать отдельные значения, хранящиеся в массиве, используя индекс:
Массивы
Массивы в Java — это структура данных, которая хранит упорядоченные коллекции фиксированного размера элементов нужного типа. В Java массив используется для хранения коллекции данных, но часто бывает полезно думать о массиве как о совокупности переменных одного типа.
Вместо объявления отдельных переменных, таких как number0, number1, . и number99, Вы объявляете одну переменную массива, например, numbers и используете numbers[0], numbers[1], . и numbers[99], для отображения отдельных переменных.
Данная статья ознакомит Вас как в Java объявить массив переменных, создать и обрабатывать массив с помощью индексированных переменных.
Объявление массива
Чтобы использовать массив в программе, необходимо объявить переменную для ссылки на массив, и Вы должны указать тип массива, который может ссылаться на переменную. Синтаксис для объявления переменной массива:
Примечание: стиль dataType[] arrayRefVar является предпочтительным. Стиль dataType arrayRefVar[] происходит из языка C/C++ и был принят в Java для C/C++-программистов.
Пример
Следующие фрагменты кода примеры использования данного синтаксиса:
Создание массива
В Java создать массив можно с помощью оператора new с помощью следующего синтаксиса:
Вышеуказанное объявление делает две вещи:
- Создает массив, используя new dataType[arraySize];
- Ссылка на недавно созданный массив присваивается переменной arrayRefVar.
Объявление переменной, создание и присвоение переменной ссылки массива могут быть объединены в одном операторе, как показано ниже:
В качестве альтернативы массивы в Java можно создавать следующим образом:
Элементы массива доступны через индекс. Отсчет индексов ведется от 0; то есть они начинают от 0 и до arrayRefVar.length-1.
Пример
Следующий оператор объявляет массив переменных myList, создает массив из 10 элементов типа double и присваивает ссылку myList:
Изображение отображает массив myList. Здесь myList имеет десять значений double и индексы от 0 до 9.
Работа с массивами
При работе с элементами массива, часто используют цикл for или цикл foreach потому, что все элементы имеют одинаковый тип и известный размер.
Пример
Полный пример, показывающий, как создавать, инициализировать и обработать массив:
Получим следующий результат:
Цикл foreach
JDK 1.5 представила новый цикл for, известный как цикл foreach или расширенный цикл for, который позволяет последовательно пройти весь массив без использования индекса переменной.
Пример
Следующий код отображает все элементы в массиве myList:
Получим следующий результат:
Передача массива в метод
Также как можно передать значение примитивного типа в метод, можно также передать массив в метод. Например, следующий метод отображает элементы в int массиве:
Его можно вызвать путем передачи массива. Например, следующий оператор вызывает метод printArray для отображения 3, 1, 2, 6, 4 и 2:
Возврат массива из метода
Метод может также возвращать массив. Например, метод, показанный ниже, возвращает массив, который является реверсирование другого массива:
Методы для массива
Класс java.util.Arrays содержит различные статические методы для поиска, сортировки, сравнения и заполнения элементов массива. Методы перегружаются для всех примитивных типов.
№ | Описание |
1 | public static int binarySearch(Object[] a, Object key) Ищет заданный массив объектов (byte, int, double, и т.д.) для указанного значения, используя алгоритм двоичного поиска. Массив должен быть отсортирован до выполнения этого вызова. Это возвращает индекс ключа поиска, если он содержится в списке; в противном случае (-(точка вставки + 1). |
2 | public static boolean equals(long[] a, long[] a2) Возвращает значение true, если два указанных массивах равны друг другу. Два массива считаются равными, если оба массива содержат одинаковое количество элементов, и все соответствующие пары элементов в двух массивах равны. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
3 | public static void fill(int[] a, int val) Присваивает определенное значение int к каждому элементу указанного целочисленного массива. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
4 | public static void sort(Object[] a) Этот метод сортировки сортирует указанный массив объектов в порядке возрастания, в соответствии с естественным порядком его элементов. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
Пример 1: создание, объявление переменных, определение (выделение памяти) и инициализация массива
В качестве примера возьмем тип данных int. Вы же можете использовать любой другой тип данных.
Пример 2: длина массива
Узнать размер массива в Java можно с помощью метода length(). Данный метод позволяет определить размерность массива.
Получим следующий результат:
Пример 3: максимальный элемент массива
Простые способы для того, чтобы найти максимальное число в массиве в Java. Сперва воспользуемся методом Math.max().
Получим следующий результат:
Ещё один пример нахождения максимального числа в массиве в Java. Здесь мы не будем использовать какие-либо методы.
Получим следующий результат:
Пример 4: минимальный элемент массива
Написанный ниже код практически ничем не отличается от кода, описанного в примере 3. Он в точности наоборот, просто здесь мы ищем минимальное число в массиве в Java. В первом способе воспользуемся методом Math.min().
Получим следующий результат:
Ещё один пример нахождения максимального числа в массиве в Java. Здесь мы не будем использовать какие-либо методы.
Получим следующий результат:
Пример 5: сумма массива
В этом примере рассмотрим как получить сумму элементов массива в Java.
Получим следующий результат:
А в этом примере используем улучшенный цикл for, чтобы найти сумму массива.
Получим следующий результат:
Пример 6: вывод массива
В данном примере рассмотрим как вывести массив на экран в Java.
Получим следующий результат:
Пример 7: вывод четных и нечетных элементов массива
В примере показано как вывести четные и нечетных элементы массива в Java.
Получим следующий результат:
Пример 8: вывод элементов массива с четным и нечетным индексом
В примере показано как вывести на экран элементы массива с четным и нечетным индексом.
Передает ли Java массив по ссылке на Method?
Программирование и разработка
Передает ли Java массив по ссылке на метод? Да, и это единственный способ передать массив функции в Java. В Java функция называется методом и является членом класса. Больше хороших новостей! Метод в Java может возвращать массив, и это по ссылке. Идентификатор массива является ссылкой.
Напомним: типичный программный файл Java имеет основной класс с методом main(). Имя основного метода — main. Однако имя основного класса не является основным. Это имя, выбранное программистом. Это также имя файла. Этот основной класс может иметь другие члены (свойства и функции). Другие классы вне основного класса могут иметь свои свойства и методы. В этой статье метод main не связан с передачей и возвратом массива. В Java свойство называется полем.
А также в этой статье показано, как передать массив методу и вернуть массив из метода по ссылке. Класс массива не нужно импортировать для этой программы.
Метод в отдельном классе
Передача по ссылке
В этом разделе статьи метод получения массива находится в отдельном классе, а не в основном классе. Пример такого класса:
Имя этого дополнительного класса — Aclass. Он имеет только один член, который является методом. Имя метода func. Он имеет только один параметр, который является объявлением массива. Он возвращает символ. Возвращаемый символ находится на третьей позиции полученного массива (индекс 2).
В методе main() можно использовать следующий фрагмент кода:
Первый оператор в этом сегменте кода определяет массив. Второй оператор объявляет объект obj из класса AClass. Следующий оператор вызывает метод объекта с именем массива (ссылкой) в качестве аргумента. Последний оператор выводит третий символ (индекс 2) массива, полученного вызванным методом. Выход будет C.
Эти два сегмента кода показывают, как массив передается в метод по ссылке.
Возврат по ссылке
Приведенный выше класс изменен для метода, возвращающего массив по ссылке, следующим образом:
Возвращаемое выражение в сигнатуре метода — это char[], а не просто char. Выражение return оператора return теперь является именем массива в параметре и больше не является элементом массива.
Соответствующий сегмент кода в методе main() изменяется следующим образом:
Тип возвращаемого значения вызова метода — массив, а не просто char. Массив по-прежнему передается в качестве аргумента так же, как и раньше. Последний оператор здесь печатает значение элемента возвращаемого массива.
Приведенные выше две программы показывают, как массив может быть передан по ссылке и как массив может быть возвращен по ссылке.
Метод в основном классе
Передача по ссылке
В этом разделе статьи метод получения массива находится в основном классе, а не в отдельном классе. Пример такого метода:
static char func ( char [ ] chs ) <
return chs [ 2 ] ;
>
Обратите внимание, что интересующий вас метод теперь является статическим, поскольку он будет вызываться из основного метода, который также является статическим и также находится в основном классе. Имя метода func. Он имеет только один параметр, который является объявлением массива. Он возвращает символ. Возвращаемый символ находится на третьей позиции полученного массива (индекс 2).
В методе main(), который является статическим, можно использовать следующий фрагмент кода:
Результатом будет C. Первый оператор в этом сегменте кода определяет массив. Здесь не объявляется объект, так как нет отдельного класса. Следующий оператор вызывает тот же метод класса, основной класс, с именем массива (ссылкой) в качестве аргумента. Последний оператор выводит третий символ (индекс 2) массива, полученного вызванным методом.
Эти два сегмента кода показывают, как массив передается в метод по ссылке.
Возврат по ссылке
Приведенный выше метод изменен для возврата массива по ссылке следующим образом:
static char [ ] func ( char [ ] chs ) <
return chs ;
>
Возвращаемое выражение в сигнатуре метода — «static char[]», а не «static char». Выражение return оператора return теперь является именем массива в параметре и больше не является элементом массива.
Соответствующий сегмент кода в методе main() изменяется следующим образом:
Первым оператором здесь является объявление массива. Тип возвращаемого значения вызова метода — массив, а не просто char. Массив по-прежнему передается в качестве аргумента так же, как и раньше. Последний оператор печатает значение элемента возвращаемого массива.
Эти две программы показывают, как массив может быть передан по ссылке и как массив может быть возвращен по ссылке.
Заключение
Да, и это единственный способ передать массив методу в Java: объявить параметр как массив и использовать имя массива в вызове метода. В Java функция называется методом и является членом класса. Больше хороших новостей! Метод (в Java) может возвращать массив, который также по ссылке. Идентификатор (имя) массива является ссылкой. Пусть определение метода (реализация) имеет тип массива в качестве параметра в сигнатуре метода для достижения этих целей. Выражение для оператора return в определении метода — это просто имя массива. Возвращаемое выражение для сигнатуры метода является типом массива. Принимающее выражение должно иметь тип массива в операторе вызова метода.