我正在制作电子邮件的信息图表。 这很顺利,但事情比较困难,例如,如果我想在一个月内收到某人发送给我的电子邮件数量,那么我就用这个:
for (Person p : AL_persons) {
for (int y = firstYear; y <= lastYear; y++) {
for (int m = 1; m <= 12; m++) {
ArrayList<Email> emailThatMonth = new ArrayList<Email>();
for (Email e : p.emails) {
if (e.date.year().get() == y
&& e.date.monthOfYear().get() == m) {
emailThatMonth.add(e);
}
}
if (emailThatMonth.size() > maxEmailsMonth)
maxEmailsMonth = emailThatMonth.size();
}
}
}
我想改进它,所以我可以更容易, 我想存储每个月的第一天,所以我可以重新使用它。 (未在此处测试代码)
ArrayList<DateTime> monthStarts = new ArrayList<DateTime>();
for (int y = firstYear; y <= lastYear; y++) {
for (int m = 1; m <= 12; m++) {
monthStarts.add(new LocalDate(y+"-"+m+"-01"));
}
}
然后获取电子邮件我可以使用子图:
for(DateTime ld : monthStarts) {
ArrayList<Email> emailThatMonth = emails.submap(ld, ld.plusMonths(1));
}
我认为这应该有效,但这是相当有意义的工作(我不介意),我只是想知道你们对它的看法,看看是否有人有提示或其他想法来处理它。
请注意,我使用joda时间(我喜欢它)
答案 0 :(得分:0)
当前的第一部分查看每个人的所有电子邮件12 * numyears次。通过在每封电子邮件中查找月份并随时增加不同的计数器,您可以简化为仅通过它们一次。我没有测试过这段代码,因为我不确定你的类结构中的某些细节。
HashMap<Person,HashMap<String,Integer>> hm = new HashMap<Person,HashMap<String,Integer>>();
for (Person p : all_persons)
{
HashMap<String,Integer> tempMap = new HashMap<String,Integer>();
for (Email e : p.emails)
{
String tag = e.date.year().get() + "-" + e.date.monthOfYear().get();
int lastvalue = tempMap.get(tag);
tempMap.put(tag, lastvalue+1);
}
hm.put(p,tempMap);
}
因此,对于第二部分(搜索给定月份的所有电子邮件),我们采用相同的方法。迭代一次,将所有匹配项添加到新列表中。
String targetMonth = "2012-01";//or whatever month you're looking for
ArrayList<Email> emailThatMonth = new ArrayList<Email>();
for (Email e: emails)
{
String tag = e.date.year().get() + "-" + e.date.monthOfYear().get();
if (tag.compareToIgnoreCase(targetMonth) == 0)
emailThatMonth.add(e);
}