Как передать в метод дополнительный параметр?

203
22 ноября 2021, 19:10

Имеется массив строк:

String[] str = {"один", "два", "три", "четыре", "пять", "шесть", "семь"};

Имеется метод, который принимает массив строк и выполняет с ним какие-либо действия:

public static void methodStr(String[] s) {
    // code
}

Вопрос: как правильно передать определенные элементы массива String'ов? Например, нужно передать только str[3], str[4] и str[5] элементы - public static void methodStr(str[с 3-го по 5-й])?

Важно: без создания нового String[]!

Answer 1

String - ссылочный тип данных, как и массив. Это значит, что при передаче его в аргументы метода, вы передаете ссылку на объект. Ссылок может быть много, а объект один.

Например: String s1 = "value"; String s2 = s1;

Теперь в результате вывода и переменной s1 и s2 в консоль вы увидите value. Вместе с тем, это лишь ссылки, в памяти будет хранится только одно значение - value. Это же происходит при передаче массива. Мы передаем массив массив и работаем с ним как с ссылкой. Фактическое копирование не происходит.

В вашей ситуации есть несколько вариантов:

1) methodStr(String[] s, int startIndex, int endIndex) - то, что уже вам предложено. Передавать весь массив в метод, а работать только с элементами , которые расположены в пределах индексов int startIndex, int endIndex

2) произвести копирование нужной части массива и передать его в метод

3) изменить сигнатуру с methodStr(String[] s) на methodStr(String ... s) . После этого при вызове данного метода вы можете передать в его аргументы произвольное количество только нужных элементов массива через запятую. Например, имея массив String[] str = {"один", "два", "три", "четыре", "пять", "шесть", "семь"}; для того, чтобы передать в метод элементы с 0 до 2 включительно нужно вызвать данный метод таким образом: methodStr(str[0], str[1], str[2]);

В последнем случае вы можете передавать в аргументы метода любые элементы массива (любое их количество и в любом порядке, т.е. не обязательно именно так, как они расположены в исходном массиве).

Посему у вас всего несколько вариантов... Сделать так, как предложено выше, т.е. передать весь массив и работать только с элементами в пределах startIndex и endIndex. скопировать часть массива и передать его в параметры. инменить сигнатру public static void methodStr(String[] s)

Answer 2

Можно добавить ещё один метод с дополнительным параметром int... filter - какие строки обрабатывать. Чтобы старый функционал остался прежним, его надо будет немного доплилить:

public static void methodStr(String[] s) {
    methodStr(s, IntStream.range(0, s.length).toArray());
}
public static void methodStr(String[] s, int... filter) {
    Arrays.stream(filter).mapToObj(i -> s[i]).forEach(str -> {
        // code
    });
}
READ ALSO
Почему не устанавливаются поля объекту через SELECT запрос к MySQL в Java

Почему не устанавливаются поля объекту через SELECT запрос к MySQL в Java

Ошибок никаких не выдаёт, просто возвращает nullQuery, посылаемый в базу данных, предполагается в виде Query = "SELECT * FROM users WHERE Login = "Login" AND Password = 12345;

74
Обрабатывать открываемый файл в Android Java

Обрабатывать открываемый файл в Android Java

Я разрабатываю свой редактор Web-кода и хочу чтобы при нажатии на определённый файл (а именно html, js, css и txt) открывался редактор (MainActivity) и в EditText...

71
Как получить объект с form (spring + thymeleaf)

Как получить объект с form (spring + thymeleaf)

Подскажите пожалуйста, что делаю неправильноПри запуске программы и ввода данных в форму, в debug значения имени и пароля пустые(фото ниже)

217
Не выполняется код после вполне нормального условия

Не выполняется код после вполне нормального условия

Собственно, после вот этого условия: if(eventgetMessage()

196