Доступ к переменной Java по имени в виде строки

Вопрос:Я объявил 10 ArrayList с именами arraylist1, arraylist2 и т.д. Я хочу динамически изменять имя переменной в цикле for: for (int i = 1; i < 5; i++) { arraylist + (i).clear(); //arraylist1.clear(); //arraylist2.clear(); //arraylist3.clear(); //arraylist4.clear(); //arraylist5.clear(); } Возможно ли это? Если да, то что это за формат? Лучший ответ: Вы не можете адресовать переменную

Вопрос:

Я объявил 10 ArrayList с именами arraylist1, arraylist2 и т.д.

Я хочу динамически изменять имя переменной в цикле for:

for (int i = 1; i < 5; i++) { arraylist + (i).clear(); //arraylist1.clear(); //arraylist2.clear(); //arraylist3.clear(); //arraylist4.clear(); //arraylist5.clear(); }

Возможно ли это? Если да, то что это за формат?

Лучший ответ:

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

Вы можете добавить все эти ArrayList в другой список. Это более гибко и, следовательно, лучший вариант.

List<List<ContactDetails>> lists2 = new ArrayList<List<String>>(); for (int i = 0; i < 10; i++) { lists2.add(new ArrayList<ContactDetails>()); }

Или добавить их в массив и получить к ним доступ по индексам массивов:

@SuppressWarnings(«unchecked») List<ContactDetails>[] lists = new List[10]; for (int i = 0; i < lists.length; i ++) { lists[i] = new ArrayList<ContactDetails>(); }

Сейчас:

for (int i = 1; i < 5; i++) { lists[i].clear(); lists2.get(i).clear(); }

Поскольку оба списка и массив Iterable, вы можете использовать foreach:

for (List list : lists) { list.clear(); } for (List list : lists2) { list.clear(); }

Если вы знаете, как достичь этого с Lambdas/Stream API, добавьте в ответ.

Ответ №1

Если ArrayList являются свойствами класса, вы можете достичь этого с помощью reflection:

((ArrayList) getClass().getField(«arraylist» + i).get(this)).clear(); Ответ №2

Вы также можете сделать это с отражением. Но я не рекомендую это.

public class SoTest { @Test public void testWithReflection() throws Exception { final MyClass myClass = new MyClass(); for (int i = 0; i < 10; i++) { final Field field = myClass.getClass().getDeclaredField(«list» + i); field.setAccessible(true); final List<String> value = (List<String>) field.get(myClass); value.clear(); } } class MyClass { private List<String> list0 = new ArrayList<>(); private List<String> list1 = new ArrayList<>(); private List<String> list2 = new ArrayList<>(); private List<String> list3 = new ArrayList<>(); private List<String> list4 = new ArrayList<>(); private List<String> list5 = new ArrayList<>(); private List<String> list6 = new ArrayList<>(); private List<String> list7 = new ArrayList<>(); private List<String> list8 = new ArrayList<>(); private List<String> list9 = new ArrayList<>(); } }

Оцените статью
Добавить комментарий