2012-02-08 2 views
0

Я составляю информационный график моих писем. Это идет довольно хорошо, но все более запутанным, то они должны быть, например, если я хочу, чтобы получить количество электронных писем кто-то отравлены меня в месяц, то я использую это:подкап периода

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 (и я люблю его)

+2

Итак ... какую информацию вы пытаетесь получить? Количество писем за каждый месяц? Большинство писем, полученных в любой месяц? Похоже, вы в конечном итоге пишете множество переменных, которые никогда не читаются, прежде чем они выйдут из сферы действия. – Thomas

+0

У меня есть люди с массивом, у человека есть массивList со всеми электронными письмами от этого человека. Я хочу получить общее количество писем в месяцах на человека. У меня также есть массив, в котором хранятся все письма от всех лиц, поэтому я хочу получить все электронные письма с месяца (все люди). – clankill3r

ответ

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);  
} 
+0

Можете ли вы объяснить приключение над моей? Также я заметил, что я использовал localDate, так что это была плохая идея обо мне, так как у меня могло быть несколько писем в тот же день, и у localDate нет часов и т. Д. Но я могу изменить это на dateTime. – clankill3r

+0

В первом вы просматриваете список адресов каждого человека в кучу раз, 4 вложенных цикла. Идет через список каждого человека 1 раз, 2 вложенных цикла. Он также предоставляет историческую запись, единственная переменная, которая не выходит за рамки вашего примера, - это максимум в течение 1 месяца, в то время как вы сказали, что хотите номер за каждый месяц. – Thomas

Смежные вопросы