Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按开始日期和结束日期对列表中的元素进行分组或筛选_Java_Arraylist_Grouping - Fatal编程技术网

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