Java 按开始日期和结束日期对列表中的元素进行分组或筛选
我有一个任务列表,如下所示:Java 按开始日期和结束日期对列表中的元素进行分组或筛选,java,arraylist,grouping,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; } 现在,我想创建第二个列表,其中包含按日期分组的具有相同组和标题的
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;
}
现在,我想创建第二个列表,其中包含按日期分组的具有相同组和标题的所有任务。这意味着,如果多个任务以任何方式重叠,我希望一个任务对应多个任务,例如,一个任务开始于另一个任务,但结束较晚,等等。我想修改新元素并调整其结束日期
我曾尝试迭代按开始日期排序的列表,并比较所有后续任务,但没有成功。我觉得自己很愚蠢,希望能得到任何帮助
谢谢这似乎是关系数据库的典型场景。 我认为最好在数据库的帮助下实现它,例如使用SQLite
在面向对象的环境中执行此操作也是可能的,但使用数据库要容易得多。:) 首先,假设您创建了小列表,其中所有
组
和名称
字段都相同。要做到这一点,一个简单的方法是使用双键词典或地图地图:
Map<String, Map<String, List<Task>>>
// Group Title Tasks
这看起来一团糟,但是,如果我们按开始时间排序,会发生什么
3 [==]
1 [======]
2 [=]
5 [=====]
0 [=====]
4 [=======]
显然,这里有三个独立的部分:
0 [=======]
1 [=]
2 [================]
要执行此缩减,您可以遍历排序列表,并在发现列表中的间隙时向结果列表添加新值。通过获取组的最早开始时间和最晚结束时间来创建新范围。我找到了一个能做到这一点的。(此处Interval
是Interval
对象的排序列表)
公共类间隔{
int启动;
内端;
Interval(){start=0;end=0;}
区间(ints,inte){start=s;end=e;}
}
...
Interval first=Interval.get(0);
int start=first.start;
int end=first.end;
ArrayList结果=新建ArrayList();
对于(int i=1;i 如果(current.start)这是许多实现中的一个常见问题。不要觉得愚蠢,这实际上是一个有一些“陷阱”的相当棘手的问题。这个问题可能会对您有所帮助。非常感谢您的帮助。我采用了这种方法,现在一切都按预期进行了。
0 [=======]
1 [=]
2 [================]
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;
}
}