Я хотів би призначити набір змінних у Java наступним чином:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Як я можу досягти цього на Java?
Я хотів би призначити набір змінних у Java наступним чином:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Як я можу досягти цього на Java?
Відповіді:
Це не те, як ви робите речі на Java. У Java немає динамічних змінних. Змінні Java повинні бути оголошені у вихідному коді 1 .
Залежно від того, чого ви намагаєтесь досягти, слід використовувати масив, a List
або a Map
; напр
int n[] = new int[3];
for (int i = 0; i < 3; i++) {
n[i] = 5;
}
List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
n.add(5);
}
Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
n.put("n" + i, 5);
}
Можна використовувати відображення для динамічного посилання на змінні, які були оголошені у вихідному коді. Однак це лише працює для змінних, які є членами класу (тобто статичні поля та поля екземпляра). Це не працює для локальних змінних. Див. Приклад @ fyr "швидкий і брудний".
Однак робити подібні речі на Java без потреби - погана ідея. Він неефективний, код складніший, і оскільки ви покладаєтесь на перевірку виконання, він більш крихкий. І це не "змінні з динамічними іменами". Це краще описати як динамічний доступ до змінних зі статичними іменами.
1 - Це твердження трохи неточне. Якщо ви використовуєте BCEL або ASM, ви можете "оголосити" змінні у файлі байт-коду. Але не робіть цього! Так лежить божевілля!
Map<String, T>
замість цього, не починайте возитися з вашим фактичним кодом.
Якщо ви хочете отримати доступ до змінних якийсь динамічний, ви можете використовувати відображення. Однак Reflection працює не для локальних змінних. Він застосовується лише для атрибутів класу.
Приблизний швидкий і брудний приклад:
public class T {
public Integer n1;
public Integer n2;
public Integer n3;
public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
NoSuchFieldException {
for (int i = 1; i < 4; i++) {
T.class.getField("n" + i).set(this, 5);
}
}
}
Вам потрібно вдосконалити цей код різними способами, це лише приклад. Це також не вважається хорошим кодом.
Те, що вам потрібно, називається масивом. Я хотів написати наступний код:
int[] n = new int[4];
for(int i=1;i<4;i++)
{
n[i] = 5;
}
Ви повинні використовувати List
або array
замість цього
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Або
int[] arr = new int[10];
arr[0]=1;
arr[1]=2;
Або навіть краще
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);
//conditionally get
map.get("n1");
Динамічні імена змінних в Java
Не існує такого.
У вашому випадку ви можете використовувати масив:
int[] n = new int[3];
for() {
n[i] = 5;
}
Для більш загальних (name, value)
пар використовуйтеMap<>
Спробуйте так:
HashMap<String, Integer> hashMap = new HashMap();
for (int i=1; i<=3; i++) {
hashMap.put("n" + i, 5);
}