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(); 
    } 
    } 
} 

: それは非常によく行くが、物事は、彼らがする必要がさらに混乱している、私は誰かが月に私をsendedでは電子メールの量を取得したい場合、たとえば、その後、私はこれを使用しますだから私はそれをはるかに簡単に得ることができます 私は毎月の最初の日を格納することを考えていたので、私はそれを再利用することができます。しかし、それは非常にいくつかの仕事(私は気にしないことだ、

for(DateTime ld : monthStarts) { 
    ArrayList<Email> emailThatMonth = emails.submap(ld, ld.plusMonths(1)); 
    } 

私は、これは動作するはずだと思う: は

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")); 
    } 
    } 

その後、私はサブマップを使用することができます電子メールを取得するために(上のここからのコードをテストしていません)あなたがそれについてどう思っているかを知りたい、それに対処するためのヒントや他のアイデアがあるかどうかを知りたかっただけです。

ノート、私はジョダ時間を使用(と私はそれを愛する)

+2

だから、どんな情報を得ようとしていますか?毎月の電子メールの数は?ある月に受け取った電子メールのほとんどは?あなたが範囲外に出る前に読むことのない多くの変数を書くことになるようです。 – Thomas

+0

私はarrayList人を持っている、人はその人からのすべての電子メールでarrayListを保持しています。一人一ヶ月の期間内にメール全体を取得したい。 私は、すべての人からのすべての電子メールを保持するarrayListも持っています。そこで、1ヶ月以内にすべての電子メールを取得したい(すべての人)。 – 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); 
} 

したがって、2番目の部分(指定された月のすべての電子メールを検索)では、同じアプローチを採用しています。一度反復して、すべてのマッチを新しいリストに追加します。

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

関連する問題