Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241

Бесконечное число аргументов в методе

03.09.2013, 01:11. Показов 7160. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть ли в джаве похожий на C# способ передавать произвольное число аргументов?

Добавлено через 6 минут
в C# ключевое слово params
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2013, 01:11
Ответы с готовыми решениями:

Переменное количество аргументов в методе
Всем привет. Делаю универсальный метод для создания SOAP сообщений для веб-сервиса и передаю в метод дважды разный набор параметров - имена...

Работа аргументов в методе и конструкторе
Добрый день!Буду благодарен, если кто-нибудь пошагово объяснит, как аргументы в методе передаются в конструктор, что-то меняют там и выдают...

Бесконечное количество аргументов
#include<iostream> #include<conio.h> using namespace std; void writeln(int count, ...) { int *p = &count; ...

16
 Аватар для Lancaster
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
03.09.2013, 01:13
Java
1
2
3
4
5
6
public void send(String... arrStr) {
 
        for (String str : arrStr) {
            System.out.println(str);
        }
    }
Вызывается вот так
send("1", "2", "3");
1
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.09.2013, 01:21
varargs не так уж и бесконечный )
насколько я помню максимум 8225 параметра так можно передать

дальше летит error: code too large
1
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
03.09.2013, 03:36  [ТС]
так, а если еще хотим другие параметры(конкретные), то в скобках метода через запятую, но varargs-ы чтобы обязательно находились в конце?

А из-за этого ведь не получится написать так

Java
1
2
3
4
    public void f (int ... index, String ... strings)
    {
        
    }
Добавлено через 5 минут
а еще:

Java
1
2
3
4
public void f (int a, String ... strings)
    {
        
    }
Можно ли как-то мне обратится ко второй строке в методе? (если я планирую передавать скажем число и 3 строки)
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
03.09.2013, 09:45
Цитата Сообщение от OxomHuK Посмотреть сообщение
Можно ли как-то мне обратится ко второй строке в методе? (если я планирую передавать скажем число и 3 строки)
Вы бы уж почитали, что такое varargs и как они реально интерпретируются...
1
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
03.09.2013, 23:33  [ТС]
Почитал, примерно понял.

Добавлено через 9 минут
а смотрите:

допустим есть некий реализованный метод
Java
1
2
3
4
public static void f(int a, String s)
    {
        
    }
а я хочу сделать перегрузку следующим образом

Java
1
2
3
4
5
6
7
public static void f(int a, String ... s)
    {       
        // как-то использовать именно первую из строк
        
        // вызвать метод f и передать ему в параметр число а и все остальные строки, кроме первой
    
    }
Получается что-то типа рекурсии, только для параметров метода:

Когда вызываем
Java
1
f(5, "Мама", "Папа", "Другой дядя")
то выполнение функции сводится к выполнению функции
Java
1
f(5, "Папа", "Другой дядя")
и т. д.,
пока не дойдем до функции
Java
1
2
3
4
public static void f(int a, String s)
    {
        
    }
которую знаем как выполнять


Можно ли это реализовать?
0
18 / 18 / 0
Регистрация: 31.03.2009
Сообщений: 101
03.09.2013, 23:43
Из s в массив из String переложить все что надо и передать этот массив вызову метода

Добавлено через 7 минут
Пример к вышесказанному

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
 
    public void f (int n, String ...s) {
        if(s.length > 1) {
            f(n, Arrays.copyOfRange(s, 1, s.length));
        } else {
            f(n, s[0]);
        }
    }
 
    @Test
    public void test () {
         f(5, "1", "2", "4");
    }
 
}
1
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
04.09.2013, 01:35  [ТС]
точно, получается просто что var_args это массив разной длины
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
04.09.2013, 01:37
Цитата Сообщение от Inf-root Посмотреть сообщение
Пример к вышесказанному
немножко поправлю )
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * @author mutagen
 */
public class SaidBefore {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        f(5, "a", "b", "c");
    }
 
    static void f(int a, String... var) {
        System.out.println("varargs a=" + a);
        for (String s : var) {
            f(a, s);
        }
    }
 
    static void f(int a, String s) {
        System.out.println("string a= " + a);
        System.out.println("s=" + s);
    }
}
0
18 / 18 / 0
Регистрация: 31.03.2009
Сообщений: 101
04.09.2013, 01:45
Цитата Сообщение от mutagen Посмотреть сообщение
немножко поправлю )
Ну так задача по другому звучала Я так думаю что кроме рекурсивного вызова метода с переменным числом аргументов, там может быть еще какая-то логика, иначе в самом деле теряется весь смысл ...
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
04.09.2013, 01:53
Цитата Сообщение от Inf-root Посмотреть сообщение
Ну так задача по другому звучала Я так думаю что кроме рекурсивного вызова метода
в моём примере нет ни грамма рекурсии ))
ну и автор говорил
Цитата Сообщение от OxomHuK Посмотреть сообщение
Почитал, примерно понял.
я лишь уточнил что он понял с точностью до наоборот )

Добавлено через 3 минуты
Цитата Сообщение от OxomHuK Посмотреть сообщение
получается просто что var_args это массив разной длины
нет он конечной длины, просто он создаётся на лету при вызове метода, это что-то вроде статической инициализации массива
int [] s = {1,2,3};
представьте себе что ... это метод который выполняет вышеописанную инициализацию
можете проверить так
Java
1
2
3
static void f(int a, String... var) {
        System.out.println(var.length);
    }
1
18 / 18 / 0
Регистрация: 31.03.2009
Сообщений: 101
04.09.2013, 02:03
Цитата Сообщение от mutagen Посмотреть сообщение
нет он конечной длины
Честно, не понял замечания. При разных вызовах метода, с разным набором элементов у него будет разная длинна и как-то не вижу противоречия словам OxomHuK'а.
0
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
04.09.2013, 02:13  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
нет он конечной длины, просто он создаётся на лету при вызове метода, это что-то вроде статической инициализации массива
да

понял я правильно, выразил мысль - неправильно

Добавлено через 26 секунд
Цитата Сообщение от Inf-root Посмотреть сообщение
там может быть еще какая-то логика,
да, конечно логика есть

Добавлено через 45 секунд
Inf-root, вы привели пример точно по тому что я спрашивал

Добавлено через 1 минуту
mutagen, имелось ввиду немного не то, Инф-Рут меня понял
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
04.09.2013, 02:19
Цитата Сообщение от Inf-root Посмотреть сообщение
Честно, не понял замечания.
Цитата Сообщение от OxomHuK Посмотреть сообщение
точно, получается просто что var_args это массив разной длины
видимо проблема понимания в слове разной - мне при таком выражении мысли приходит в голову динамический массив
так как у обычных массивов длина тоже разная и в чём тогда отличие от varargs становится совершено непонятно )

Добавлено через 1 минуту
Цитата Сообщение от OxomHuK Посмотреть сообщение
Получается что-то типа рекурсии, только для параметров метода:
Когда вызываем
Java
1
f(5, "Мама", "Папа", "Другой дядя")
то выполнение функции сводится к выполнению функции
Java
1
f(5, "Папа", "Другой дядя")
и т. д.,
всё что вышенаписанно OxomHuK-ом полная ахинея - нет никакой рекурсии
есть аналогия
Java
1
2
3
4
5
6
static void f(int a, String... var) {
        System.out.println("varargs a=" + a);
        for (String s : var) {
            f(a, s);
        }
    }
эквивалент
Java
1
2
3
4
5
6
static void f(int a, String [] var) {
        System.out.println("varargs a=" + a);
        for (String s : var) {
            f(a, s);
        }
    }
только во втором варианте динамика исчезает
0
18 / 18 / 0
Регистрация: 31.03.2009
Сообщений: 101
04.09.2013, 02:32
Цитата Сообщение от mutagen Посмотреть сообщение
видимо проблема понимания в слове разной
Ага, согласен

mutagen, по моему ты пропускаешь момент:

Цитата Сообщение от OxomHuK Посмотреть сообщение
Можно ли это реализовать?
Он именно и спрашивал, можно ли рекурсивно добраться до f(int, String) рекурсивными вызовами f(int, String ...).

Код
Цитата Сообщение от mutagen Посмотреть сообщение
Java
1
2
3
4
5
6
static void f(int a, String... var) {
     System.out.println("varargs a=" + a);
     for (String s : var) {
         f(a, s);
     }
 }
не эквивалентен

Цитата Сообщение от Inf-root Посмотреть сообщение
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
public void f (int n, String ...s) {
        if(s.length > 1) {
             f(n, Arrays.copyOfRange(s, 1, s.length));
         } else {
             f(n, s[0]);
         }
}
@Test
 public void test () {
       f(5, "1", "2", "4");
 }
}
тут скорее будет что-то типа этого:

Java
1
2
3
4
5
6
 static void f(int a, String... var) {
        for(int idx = var.length - 1; idx > 0; --idx) {
               // do something with var[idx]
        }
        f(a, var[0]);
 }
1
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
04.09.2013, 02:51
Цитата Сообщение от Inf-root Посмотреть сообщение
Он именно и спрашивал, можно ли рекурсивно добраться до f(int, String) рекурсивными вызовами f(int, String ...).
Аааа - наконец я понял о чём вы )
меня смутил f(int, String) - я подумал что это перегруженный метод и вы собирались до него добираться разложившись на рекурсию чтобы в конечной точке вызвать его и подумал что рекурсия в данной постановке задачи нафиг не требуется )
1
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
04.09.2013, 02:59  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
нет никакой рекурсии
как-бы есть, мне просто удобней называть то что получается рекурсией, непринципиально
просто сложно формулировать это всё дело правильно, а вы чуть что сразу ловите

По факту получается с помощью метода f(int a, String s) я могу написать метод когда строк произвольное количество
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.09.2013, 02:59
Помогаю со студенческими работами здесь

Динамическое количество аргументов в методе
Кто нибудь наверняка может мне помочь, я совсем забыл как объявить метод, чтобы в него можно было передавать массив параметров? Помоему,...

Бесконечное число
Всем привет, подскажите идеи, как реализовать бесконечное число, у меня была идея, но она быстро стала так себе, как только я взялся за...

Бесконечное число в диапозоне
Привет, ребят:) Потребовался диапазон от определенного числа до ... не знаю куда, но знаю, что все равно остановка будет. Так вот. Как...

Приём константных векторов класса, как аргументов в методе другого класса
Есть такой класс: class Order { private: int numberOrder; map <string, int> catalogDish; double totalCost; public: ...

Как в js поставить знак - бесконечное число?
За ранее благодарен


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru