我有一个任务列表,如下所示:
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;
}
现在我想创建第二个列表,其中所有任务具有按日期分组的相同组和标题。这意味着如果它们以任何方式重叠,我想要一个任务用于多个任务,例如一个任务从一个接一个开始,但稍后结束,依此类推。我另外我想修改新元素并调整其结束日期。
我已经尝试迭代按开始日期排序的列表并比较所有后续任务,但收效甚微。我觉得很愚蠢,也会感激任何帮助。
谢谢
答案 0 :(得分:1)
我将首先假设您已创建了所有group
和name
字段相同的小型列表。这样做的一个简单方法是使用两个关键词典或地图地图:
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就是这样做的。 (此处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; } }
在地图地图中对每个小清单进行排序后,您可以将它们全部合并到一个列表中。
答案 1 :(得分:-1)
这似乎是关系数据库的典型场景。 我认为最好在数据库的帮助下实现它,例如使用SQLite。
在面向对象中执行此操作也是可能的,但使用数据库要容易得多。 :)