Как мне динамически именовать объекты в Java? - PullRequest
13 голосов
/ 26 апреля 2010

Допустим, мне нужно было создать серию объектов String [].

Я знаю, что если бы я хотел создать массив строк с именем «test» для хранения 3 строк, я мог бы сделать

String [] test = new String [3];

Но, допустим, мне нужно было сделать серию этих массивов, и я хотел, чтобы они были названы, 1,2, 3, 4, 5 ... и т. Д. Сколько бы мне ни понадобилось, и я не знал, сколько Мне нужно.

Как мне добиться эффекта, подобного этому:

for (int k=0; k=5; k++){ 
String[] k = new String[3];
}

Который создал бы 5 строковых массивов с именами от 1 до 5. В основном я хочу иметь возможность создавать объекты массива с именем, определяемым какой-либо другой функцией. Почему я не могу это сделать? Я просто тупой?

Ответы [ 4 ]

21 голосов
/ 26 апреля 2010

В Java нет никаких «переменных переменных» (то есть переменных с именами переменных), но вы можете создать Карты или Массивы для решения вашей конкретной проблемы. Когда вы сталкиваетесь с проблемой, которая заставляет вас думать: «Мне нужны переменные для динамического изменения имен», вы должны подумать «ассоциативный массив». В Java вы получаете ассоциативные массивы, используя Map s.

То есть вы можете хранить список ваших массивов, например:

List<String[]> kList = new ArrayList<String[]>();
for(int k = 0; k < 5; k++){
   kList.add(new String[3]);
}

Или, может быть, немного ближе к тому, что вы ищете, вы можете использовать карту:

Map<Integer,String[]> kMap = new HashMap<Integer,String[]>();
for(int k = 0; k < 5; k++){
  kMap.put(k, new String[3]);
}
// access using kMap.get(0) etc..
7 голосов
/ 26 апреля 2010

Другие уже предоставили отличные ответы, но для охвата всех основ Java имеет массив массивов.

String[][] k = new String[5][3];
k[2][1] = "Hi!";

Теперь у вас нет 5 переменных с именами k1, k2, k3, k4, k5, каждая из которых является String[3] ...

... но у вас есть массив String[], k[0], k[1], k[2], k[3], k[4], каждый из которых представляет собой String[3].

4 голосов
/ 26 апреля 2010

Самое близкое, что вы получите в Java:

Map<String, String[]> map = new HashMap<String, String[]>();

for (int k=0; k=5; k++){ 
    map.put(Integer.toString(k), new String[3]);
}

// now map.get("3") will get the string array named "3".

Обратите внимание, что "3" не является переменной, но в сочетании с объектом map он работает как один ... вроде.

2 голосов
/ 26 апреля 2010

То, что вы хотите сделать, называется метапрограммирование - программирование программы, которую Java не поддерживает (она позволяет метаданные только посредством аннотаций). Однако для такого простого случая использования вы можете создать метод, который будет принимать int и возвращать требуемый массив строк, например, путем доступа к массиву массивов. Если вам нужно более сложное соглашение об именах, рассмотрите оператор swtich для нескольких значений и map для большего количества значений. Для фиксированного числа значений с пользовательскими именами определите Enum, который можно передать в качестве аргумента.

...