java—按开始和结束日期对列表中的元素进行分组或筛选

7ivaypg9  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(660)

我的任务列表如下所示:

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

现在,我想创建第二个列表,其中包含按日期分组的具有相同组和标题的所有任务。这意味着,如果多个任务以任何方式重叠,我希望一个任务对应多个任务,例如,一个任务开始于另一个任务,但结束较晚,等等。我想修改新元素并调整其结束日期。
我试过遍历一个按开始日期排序的列表,并比较所有后续任务,但没有成功。我觉得自己很蠢,希望能得到任何帮助。
谢谢您

bvjveswy

bvjveswy1#

我首先假设你已经创建了一个小列表 group 以及 name 字段是相同的。要做到这一点,一个简单的方法是使用两个键的字典或Map:

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

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

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

这看起来一团糟,但是,如果我们按开始时间排序会发生什么?

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

很明显,这里有三个独立的部分:

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

要执行此缩减,您可以遍历排序的列表,并在发现列表中的间隙时向结果列表添加新值。通过获取组的最早开始时间和最晚结束时间来创建新范围。我在github上找到了一个zac xin的例子,它就是这样做的(在这里 intervals 是一个排序的 Interval 对象)

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

一旦您对Map中的每个小列表进行了排序,就可以将它们全部合并到一个列表中。

shstlldc

shstlldc2#

这似乎是关系数据库的典型场景。我认为最好在数据库的帮助下实现它,例如使用sqlite。
在面向对象的环境中这样做也是可能的,但是使用数据库要容易得多。:)

相关问题