Create variable names using a loop in Java?

SeerUK picture SeerUK · Apr 19, 2010 · Viewed 24.9k times · Source

first time poster, long time reader so be gentle with me :)

See the following code which works to generate me timestamps for the beginning and end of every month in a financial year.

int year = 2010;
// Financial year runs from Sept-Aug so earlyMonths are those where year = FY-1 and lateMonths are those where year = FY
int[] earlyMonths = {8, 9, 10, 11}; // Sept to Dec
int earlyYear = year -1;
for (int i : earlyMonths) {
    month = i;
    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(earlyYear,month,1,0,0,0);
    Long start = cal.getTimeInMillis();
    cal.clear();
    cal.set(earlyYear,month,1);
    lastDayofMonth = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
    cal.set(earlyYear,month,lastDayofMonth,23,59,59);
    Long end = cal.getTimeInMillis();
}
int[] lateMonths = {0, 1, 2, 3, 4, 5, 6, 7}; // Jan to Aug
for (int i : lateMonths) {
    month = i;
    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(year,month,1,0,0,0);
    Long start = cal.getTimeInMillis();
    cal.clear();
    cal.set(year,month,1);
    lastDayofMonth = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
    cal.set(year,month,lastDayofMonth,23,59,59);
    Long end = cal.getTimeInMillis();
}

So far so good, but in order to use these results I need these timestamps to be output to variables named by month (to be used in a prepared statement later in the code. e.g. SeptStart = sometimestamp, SeptEnd = some timestamp etc etc.

I don't know if it is possible to declare new variables based on the results of each loop. Any ideas?

Answer

p.marino picture p.marino · Apr 19, 2010

Why not use a Map?

After all you want to have a "container" for some value and address it with a specified name.

So just make the "variable name" your key and "variable value" your, ehm, value.

Edited because you wanted a Sorted collection:

First of all, go for a Treemap instead of a Map.

Also, to preserve lexicograph order, normalize your month number padding zeroes to the left, and use "begin" and "end" as delimiters

So you will have:

01_begin
01_end
02_begin
...
10_begin
10_end
...

which will get printed in the correct order when you visit the treemap.