import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Integer> links = new ArrayList<Integer>();
links.add(3);
links.add(6);
links.add(9);
links.add(12);
links.add(15);
links.add(18);
links.add(21);
links.add(24);
links.add(27);
links.add(30);
// 采用当月的方式进行构造,现在是 2008 年 7 月
Nil2000 nil = new Nil2000(links);
System.out.println(nil.toString());
}
}
class Nil2000 {
/**
* 生成日历的 Calendar
*/
private Calendar calendar;
/**
* 有链接的日期
*/
private List<Integer> links;
private static String TABLE_START = "<table width=/"200/" border=/"1/">/n";
private static String TABLE_END = "<table>/n";
private static String TR_START = " <tr>/n";
private static String TR_END = " </tr>/n";
private static String TD_START = " <td>";
private static String TD_END = "</td>/n";
private static String TD_BLANK = TD_START + " " + TD_END;
/**
* 链接字符串的常量,需要将 {0} 替换成指定字符串
*/
private static String LINK = "<a href=/"link{0}/">{0}</a>";
/**
* 构造当月的日历
* @param links 需要带有链接的日期
*/
public Nil2000(List<Integer> links) {
this(Calendar.getInstance(), links);
}
/**
* 构造指定日期月份的日历
* @param calendar 指定日期
* @param links 需要带有链接的日期
*/
public Nil2000(Calendar calendar, List<Integer> links) {
calendar.set(Calendar.DATE, 1);
this.calendar = calendar;
this.links = links;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(TABLE_START);
sb.append(TR_START);
int total = 1;
// 若非周日时,在添加空的 <td> 串,以空开,将 1 号显示在指定的位置上
for(int k = calendar.get(Calendar.DAY_OF_WEEK); total < k; total++) {
appendBlank(sb);
}
for(int i = 1, k = calendar.getActualMaximum(Calendar.DATE); i <= k; i++) {
if((total - 1) % 7 == 0) {
sb.append(TR_END).append(TR_START);
}
appendDate(sb, i);
total++;
}
// 最后的日期如果不是周六,则在后面添加上若干个 <td> 串,以填满表格
while((total - 1) % 7 != 0) {
appendBlank(sb);
total++;
}
sb.append(TR_START);
sb.append(TABLE_END);
return sb.toString();
}
private void appendBlank(StringBuffer sb) {
sb.append(TD_BLANK);
}
private void appendDate(StringBuffer sb, int date) {
sb.append(TD_START);
if(links.contains(date)) {
sb.append(LINK.replace("{0}", String.valueOf(date)));
} else {
sb.append(date);
}
sb.append(TD_END);
}
}
运行结果为:
<table width="200" border="1">
<tr>
<td> </td>
<td> </td>
<td>1</td>
<td>2</td>
<td><a href="link3">3</a></td>
<td>4</td>
<td>5</td>
</tr>
<tr>
<td><a href="link6">6</a></td>
<td>7</td>
<td>8</td>
<td><a href="link9">9</a></td>
<td>10</td>
<td>11</td>
<td><a href="link12">12</a></td>
</tr>
<tr>
<td>13</td>
<td>14</td>
<td><a href="link15">15</a></td>
<td>16</td>
<td>17</td>
<td><a href="link18">18</a></td>
<td>19</td>
</tr>
<tr>
<td>20</td>
<td><a href="link21">21</a></td>
<td>22</td>
<td>23</td>
<td><a href="link24">24</a></td>
<td>25</td>
<td>26</td>
</tr>
<tr>
<td><a href="link27">27</a></td>
<td>28</td>
<td>29</td>
<td><a href="link30">30</a></td>
<td>31</td>
<td> </td>
<td> </td>
<tr>
<table>