4

I have declared 10 ArrayLists with names arraylist1, arraylist2 and so on.

I want to dynamically change variable name in a for loop:

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

}

Is it possible? If so what is format to do so?

Nick Volynkin
  • 14,023
  • 6
  • 43
  • 67
Sanjana Nair
  • 2,663
  • 6
  • 26
  • 44
  • No, you are not able to change variable name in java (at least not in conventional way). Is it any reason why you want to do this? – user902383 Jun 16 '15 at 10:09
  • @user902383: I have created new arraylist's and method and I want to call only the method once in a loop and clear arraylist then add values for that arraylist. – Sanjana Nair Jun 16 '15 at 10:12
  • 2
    If you have several lists, and you want to clean then in list, why not put them into list, or other collection – user902383 Jun 16 '15 at 10:15

3 Answers3

8

You can not address a variable with its name as string (except with reflection, but that's an overkill for this task).

You can add all these ArrayList's to another List. This is more flexible and, thus, a better option.

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

Or add them to an array and access them by array indexes:

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

Now:

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

As both List and array are Iterable, you can use the foreach syntax:

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

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

If you know how to achieve the same with Lambdas / Stream API, please add to the answer.

Community
  • 1
  • 1
Nick Volynkin
  • 14,023
  • 6
  • 43
  • 67
  • Thanks for quick reply..What if I have arraylist of something like this: ArrayList arraylist1; – Sanjana Nair Jun 16 '15 at 10:09
  • Thanks for the quick fix. I am getting warning "Type safety: The expression of type List[] needs unchecked conversion to conform to List[]" - Do I need to worry about it? – Sanjana Nair Jun 16 '15 at 10:19
  • @NickVolynkin: I'm sorry, I was typing too fast without having made a test. I think the best way (without any warning nedded to be supressed) is the variant with the list of lists (lists2) – xmoex Jun 16 '15 at 10:43
  • @xmoex I agree about a list of lists, it's the most flexible option. The `new List[10]` was in my first version, so I made the same mistake. – Nick Volynkin Jun 16 '15 at 10:44
1

If the ArrayLists are class properties, you can achieve this with reflection:

((ArrayList) getClass().getField("arraylist" + i).get(this)).clear();
Armand
  • 23,463
  • 20
  • 90
  • 119
1

You can also do this with reflection. But I do not recommend it.

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<>();
    }
}
bhdrkn
  • 6,244
  • 5
  • 35
  • 42