子图一段时间

时间:2012-02-08 22:59:20

标签: java jodatime

我正在制作电子邮件的信息图表。 这很顺利,但事情比较困难,例如,如果我想在一个月内收到某人发送给我的电子邮件数量,那么我就用这个:

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时间(我喜欢它)

1 个答案:

答案 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);      
}