2017-01-04 2 views
2

ことで、私は次のようになりタスクのリストをしました:グループまたはリスト内のフィルタ要素開始日と終了日

public Task(String content, Date start, Date end, String group, String title) { 
    this.content = content; 
    this.start = start; 
    this.end = end; 
    this.group = group; 
    this.title = title; 
} 

今私は、同じグループのすべてのタスクと第二のリストを作成したいですタイトルは日付でグループ化されています。これは、何らかの方法で重複する場合、複数のタスクに対して1つのタスクを必要とすることを意味します。 1つのタスクは別のタスクの後に開始されますが、後で終了します。さらに、新しい要素を修正し、終了日を調整したいと思います。

私は開始日でソートされたリストを反復しようとしましたが、後続のすべてのタスクを比較しましたが、小さな成功はありました。私は愚かな気持ちと助けに感謝します。

ありがとうございました

+1

これは多くの実装でよく見られる問題です。愚かな気持ちはしないでください。実際にはいくつかの「落ち着き」の問題はかなり難しいです。この質問はあなたに役立つかもしれません。http://stackoverflow.com/questions/32196549/combining-overlapping-date-ranges-java – flakes

答えて

1

すべてのgroupフィールドとnameフィールドが同じである小さなリストを作成したと仮定することから始めます。あなたは、非重複エントリにそれを減らしたいとしている各内側のリストについて

Map<String, Map<String, List<Task>>> 
// Group  Title  Tasks 

:これを行うに簡単にアプローチは、2つのキー辞書やマップのマップを使用することです。これは混乱のように見える

0      [=====] 
1 [======] 
2   [=] 
3 [==] 
4       [=======] 
5    [=====] 

我々は開始時間によってそれをソートした場合、しかし、何が起こるのでしょう?範囲のリストは怒鳴るように表すことができる想像

3 [==] 
1 [======] 
2   [=] 
5    [=====] 
0      [=====] 
4       [=======] 

ここでそれが独立している三つの部分があることは明らかである。この減少を実行するには

0 [=======] 
1   [=] 
2    [================] 

は、あなたがソートされたリストを繰り返し処理することができますし、いつでもあなたの結果リストに新しい値を追加リスト内のギャップを発見する。グループの最初の開始時刻と最新の終了時刻を使用して新しい範囲を作成します。私はちょうどこれを行うexample on github by zac-xinを見つけた。あなたがマップのあなたマップ内の各小リストをソートしたら(ここでintervalsIntervalオブジェクトのソートされたリストである)

public class Interval { 
    int start; 
    int end; 
    Interval() { start = 0; end = 0; } 
    Interval(int s, int e) { start = s; end = e; } 
} 
... 

Interval first = intervals.get(0); 
int start = first.start; 
int end = first.end; 

ArrayList<Interval> result = new ArrayList<Interval>(); 

for(int i = 1; i < intervals.size(); i++){ 
    Interval current = intervals.get(i); 
    if(current.start <= end){ 
     end = Math.max(current.end, end); 
    }else{ 
     result.add(new Interval(start, end)); 
     start = current.start; 
     end = current.end; 
    } 
} 

、あなたは1つのリストにそれらすべてを組み合わせることができます。

+1

ありがとうございます。私はアプローチを採用し、今はすべてが期待通りに機能します。 – mirco

-1

これは、リレーショナルデータベースの典型的なシナリオのようです。 データベースの助けを借りて実装する方が良いと思います。 SQLiteを使用します。

オブジェクトorientadedでこれを行うことも可能ですが、データベースを使用する方がはるかに簡単です。 :)

関連する問題