Create variable names using loop in Java?

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

See the following code that works to create timestamps for the beginning and end of each month in a fiscal 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 to use these results, I need these timestamps to be displayed in variables with a name of a month (for use in the prepared document later in the code. For example, SeptStart = sometimestamp, SeptEnd = some timestamp, etc. . and etc.

I do not know if new variables can be declared based on the results of each cycle. Any ideas?

+6
java variables loops dynamic names
source share
6 answers

Why not use Map ?

In the end, you want to have a “container” for some value and specify it with the specified name.

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

Edited because you wanted to have a sorted collection:

First of all, go to Treemap instead of map.

In addition, to preserve the lexicographer's order, normalize the zero notes of the month number 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 be printed in the correct order when visiting the treemap.

+7
source share

Instead of generating variable names, use Map , where the key is the name of the month and the value is the value for this month.

Instead of Date septStart = some date you can do startDates.put("September", some date)

Or better yet, store the values ​​in an array where the index is the month number: startDates[8] = some date // 0-indexed!

+3
source share

You cannot declare variables dynamically. I would suggest declaring two arrays of timestamps (one for the beginning and one for the endings) and populate them. Then either use these arrays instead of the named variables, or declare the variables manually and set them manually.

 Calendar[] beginnings = new Calendar[12]; Calendar[] endings = new Calendar[12]; for (int i: earlyMontsh) { // Calc beginning ... beginnings[i] = cal; cal = Calendar.getInstance(); // Important, create new instance! // Calc ending ... endings[i] = cal; } // ... Same for second loop ... Calendar janStart = beginnings[0]; Calendar janEnd = endings[0]; Calendar febStart = beginnigs[1]; Calendar febEnd = endings[1]; // .. And so on ... Calendar decStart = beginnings[11]; Calendar decEnd = endings[11]; 
+1
source share

Storing values ​​in an array will allow you to access them using Calendar.Month constants

 import java.util.Calendar; import java.util.GregorianCalendar; public class Cal { Long[] start = new Long[12]; Long[] end = new Long[12]; private void init(int year) { for (int month = 0; month < 12; month++) { Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(year, month, 1, 0, 0, 0); start[month] = cal.getTimeInMillis(); cal.clear(); cal.set(year, month, 1); int lastDayofMonth = cal .getActualMaximum(GregorianCalendar.DAY_OF_MONTH); cal.set(year, month, lastDayofMonth, 23, 59, 59); end[month] = cal.getTimeInMillis(); } } public static void main(String[] args) { Cal cal = new Cal(); cal.init(2010); System.out.println( "start:" + cal.start[Calendar.JANUARY]+ " - " + cal.end[Calendar.JANUARY ]); } } 
+1
source share

The map really seems like a good solution :) I am new to java / jsp (and most programs in general!), So I did not know how simple it is :)

The following code:

 // Financial year runs from Sept-Aug so earlyMonths are those where year = FY-1 and lateMonths are those where year = FY HashMap hm = new HashMap(); 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(); hm.put(month + "_start", new Long(start)); 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(); hm.put(month + "_end", new Long(end)); } 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(); hm.put(month + "_start", new Long(start)); 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(); hm.put(month + "_end", new Long(end)); } Set set = hm.entrySet(); Iterator hmi = set.iterator(); while(hmi.hasNext()){ Map.Entry me = (Map.Entry)hmi.next(); out.println(me.getKey() + " : " + me.getValue() + "<br>"); } 

Gives me the following result:

 4_end : 1275350399000 3_start : 1270080000000 8_end : 1254355199000 10_start : 1257033600000 1_start : 1264982400000 2_start : 1267401600000 8_start : 1251763200000 10_end : 1259625599000 0_start : 1262304000000 7_start : 1280620800000 0_end : 1264982399000 4_start : 1272672000000 5_start : 1275350400000 11_end : 1262303999000 5_end : 1277942399000 6_start : 1277942400000 9_start : 1254355200000 3_end : 1272671999000 2_end : 1270079999000 9_end : 1257033599000 11_start : 1259625600000 1_end : 1267401599000 7_end : 1283299199000 6_end : 1280620799000 

I was curious why it was ordered this way? This is not important in terms of functionality, but for debugging purposes, can a hash map be ordered?

Thank you for the great offers of all the round people :)

0
source share

To complete, I am posting the full code. It displays the availability information of our production servers from the database for the management report. This is the hardest thing I did in JSP :)

I am sure that a lot can be done more elegantly, so please do not hesitate to advise :) (obviously, db passwords, etc. XXX'ed)

 <%@page language="java" contentType="text/html"%> <%@page import="java.util.*,java.sql.*,java.text.*"%> <html> <head> <title>KPI: FY10</title> <link rel="stylesheet" type="text/css" href="reports.css"> </head> <% // Example SQL "select count(timestamp) from jagel_hq_log where timestamp > 1270080000000 and timestamp < 1272671999000 and kpi_id = 9" /* ------------- START CONFIGURABLE VARIABLES -------------*/ int year = 2010; boolean leapYear = false; String db_user = "XXXX"; String db_pass = "XXXX"; // Special Case of Leap Years int febMins; if(leapYear=true) { febMins = 41760; } else { febMins = 44640; } int yearMins; if(leapYear=true) { yearMins = 527040; } else { yearMins = 525600; } int minsYear = yearMins; // minutes in each month int minsJan = 44640; int minsFeb = febMins; int minsMar = 44640; float minsApr = 43200; int minsMay = 44640; int minsJun = 43200; int minsJul = 44640; int minsAug = 44640; int minsSep = 43200; int minsOct = 44640; int minsNov = 43200; int minsDec = 44640; String maxAvail = "#CDEB8B"; String medAvail = "#FFFF88"; String minAvail = "#FDE8D7"; String colour; /* ------------- END CONFIGURABLE VARIABLES -------------*/ /* Initialise Variables */ int month = 0; int lastDayofMonth; int totalMins = 0; float mins_down = 0; float avail = 0; DecimalFormat round = new DecimalFormat("###.###"); Long startTime; Long endTime; // Connect to DB DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); String connString="jdbc:oracle:thin:@XXXXXXXX.XXXXX.com:XXXX:XXXXXX"; Connection conn = DriverManager.getConnection(connString,db_user,db_pass); /* Get months of year as 'to' and 'from' timestamps */ // Financial year runs from Sept-Aug so earlyMonths are those where 'year = FY-1' and lateMonths are those where 'year = FY' HashMap hm = new HashMap(); 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(); hm.put(month + "_start", new Long(start)); 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(); hm.put(month + "_end", new Long(end)); } 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(); hm.put(month + "_start", new Long(start)); 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(); hm.put(month + "_end", new Long(end)); } %> <!-- Header --> <a href="index.jsp"><-- Back to Index</a><br> <div align="center"> <h2>IITP Availability Report</h2> <% Calendar c = Calendar.getInstance(); out.println("Report Generated: " + c.getTime() + " and accurate up to (and including) yesterday"); %> </div> <!-- Start Table --> <table class="mar"> <tr> <th class="header">KPI Name</th> <th class="header">Description</th> <th class="header" colspan="2">Sep <% out.println( year - 1 ); %></th> <th class="header" colspan="2">Oct <% out.println( year - 1 ); %></th> <th class="header" colspan="2">Nov <% out.println( year - 1 ); %></th> <th class="header" colspan="2">Dec <% out.println( year - 1 ); %></th> <th class="header" colspan="2">Jan <% out.println( year ); %></th> <th class="header" colspan="2">Feb <% out.println( year ); %></th> <th class="header" colspan="2">Mar <% out.println( year ); %></th> <th class="header" colspan="2">Apr <% out.println( year ); %></th> <th class="header" colspan="2">May <% out.println( year ); %></th> <th class="header" colspan="2">Jun <% out.println( year ); %></th> <th class="header" colspan="2">Jul <% out.println( year ); %></th> <th class="header" colspan="2">Aug <% out.println( year ); %></th> <th class="header" colspan="2">Avg <% out.println( year ); %></th> </tr> <tr> <th class="top">&nbsp</th> <th class="top">&nbsp</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> <th class="top">Mins Down</th> <th class="top">% Avail</th> </tr> <% // Get all KPI_ID's Statement stmt = conn.createStatement(); ResultSet rs_id = stmt.executeQuery("select distinct (KPI_ID) from JAGEL_KPI_SPECS order by KPI_ID"); // initialise Result Set ResultSet rs_minsDown; while (rs_id.next()){ int id = rs_id.getInt("KPI_ID"); // Get the kpi name and description from db PreparedStatement ps_names = conn.prepareStatement("select KPI_ID, KPI_GROUP_NAME, DESCRIPTION from JAGEL_KPI_SPECS where KPI_ID = " + id); ResultSet rs_names = ps_names.executeQuery(); while (rs_names.next()) { out.println("<tr><td>" + rs_names.getString("KPI_GROUP_NAME") + "</td><td>" + rs_names.getString("DESCRIPTION") + "</td>"); } rs_names.close(); // get the number of minutes down for each month and availability % PreparedStatement ps_minsDown = conn.prepareStatement("select count(timestamp) from jagel_hq_log where timestamp > ? and timestamp < ? and kpi_id = " + id); //September startTime = (Long) hm.get("8_start"); endTime = (Long) hm.get("8_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsSep*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //October startTime = (Long) hm.get("9_start"); endTime = (Long) hm.get("9_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsOct*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //November startTime = (Long) hm.get("10_start"); endTime = (Long) hm.get("10_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsNov*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //December startTime = (Long) hm.get("11_start"); endTime = (Long) hm.get("11_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsDec*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //January startTime = (Long) hm.get("0_start"); endTime = (Long) hm.get("0_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsJan*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //February startTime = (Long) hm.get("1_start"); endTime = (Long) hm.get("1_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsFeb*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //March startTime = (Long) hm.get("2_start"); endTime = (Long) hm.get("2_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsMar*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //April startTime = (Long) hm.get("3_start"); endTime = (Long) hm.get("3_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsApr*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //May startTime = (Long) hm.get("4_start"); endTime = (Long) hm.get("4_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsMay*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //June startTime = (Long) hm.get("5_start"); endTime = (Long) hm.get("5_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsMay*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //July startTime = (Long) hm.get("6_start"); endTime = (Long) hm.get("6_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsJul*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //August startTime = (Long) hm.get("7_start"); endTime = (Long) hm.get("7_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsAug*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); //YEAR startTime = (Long) hm.get("8_start"); endTime = (Long) hm.get("7_end"); ps_minsDown.setLong(1,startTime); ps_minsDown.setLong(2,endTime); rs_minsDown = ps_minsDown.executeQuery(); rs_minsDown.next(); mins_down = rs_minsDown.getInt("COUNT(TIMESTAMP)"); avail = 100-(mins_down/minsYear*100); if(avail < 99.98) { colour=minAvail; } else if(avail < 100){ colour=medAvail; } else { colour=maxAvail; } out.println("<td bgcolor=" + colour + ">" + mins_down + "</td><td bgcolor=" + colour + ">" + round.format(avail) + "%"); rs_minsDown.close(); } // close remaining result set and connection rs_id.close(); conn.close(); %> </table> <!-- Footer --> <br><a href="index.jsp"><-- Back to Index</a> </body> </html> 
0
source share

All Articles