按开始日期和结束日期对列表中的元素进行分组或过滤

时间:2017-01-04 09:00:08

标签: java arraylist grouping

我有一个任务列表,如下所示:

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

现在我想创建第二个列表,其中所有任务具有按日期分组的相同组和标题。这意味着如果它们以任何方式重叠,我想要一个任务用于多个任务,例如一个任务从一个接一个开始,但稍后结束,依此类推。我另外我想修改新元素并调整其结束日期。

我已经尝试迭代按开始日期排序的列表并比较所有后续任务,但收效甚微。我觉得很愚蠢,也会感激任何帮助。

谢谢

2 个答案:

答案 0 :(得分:1)

我将首先假设您已创建了所有groupname字段相同的小型列表。这样做的一个简单方法是使用两个关键词典或地图地图:

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

对于每个内部列表,您将要将其减少为非重叠条目。想象一下,您的范围列表可以表示为如下:

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)

这似乎是关系数据库的典型场景。 我认为最好在数据库的帮助下实现它,例如使用SQLite。

在面向对象中执行此操作也是可能的,但使用数据库要容易得多。 :)