比较两个list中的值,求两个时间段的算法

java_qingchong 2009-03-18 09:06:05
两个ArrayList<Test> list1,list2;
都存的是Test对象

求list1与list2时间段的差集
即求在list1除去list2出现过的时间段的List
若list2中有时间段包含了list1中的时间段则除去list1的该条记录

public class Test{

private Date startTime ;
private Date endTime ;
}

例如:list1中的数据为 startTime endTime
2009.06.01 2009.06.05
2009.06.11 2009.06.13
2009.06.20 2009.06.30

list2中的数据为 startTime endTime
2009.06.03 2009.06.08
2009.06.10 2009.06.15
2009.06.22 2009.06.25

求得结果为: startTime endTime
2009.06.01 2009.06.03
2009.06.20 2009.06.22
2009.06.25 2009.06.30
...全文
311 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_qingchong 2009-03-19
  • 打赏
  • 举报
回复
顶一下
sjkof 2009-03-19
  • 打赏
  • 举报
回复

import java.util.ArrayList;

class TimeDate {
private int startTime;
private int endTime;

public TimeDate(int startTime, int endTime) {
this.startTime = startTime;
this.endTime = endTime;
}

public int getStartTime() {
return startTime;
}

public void setStartTime(int startTime) {
this.startTime = startTime;
}

public int getEndTime() {
return endTime;
}

public void setEndTime(int endTime) {
this.endTime = endTime;
}

public static int Compare(int former, int latter) {
if (former < latter) {
return -1;
} else if (former == latter) {
return 0;
} else {
return 1;
}
}

@Override
public String toString() {
String s = this.startTime + " to " + this.endTime;
return s;
}

}

public class TimeMinus {

public static boolean calculateTimeMinus(TimeDate former, TimeDate latter) {
boolean latterFlag = false;
if (TimeDate.Compare(former.getStartTime(), latter.getStartTime()) == -1) {
if (TimeDate.Compare(former.getEndTime(), latter.getStartTime()) != 1) {
System.out.println(former.getStartTime() + " to "
+ former.getEndTime());
} else {
if (TimeDate.Compare(former.getEndTime(), latter.getEndTime()) != 1) {
System.out.println(former.getStartTime() + " to "
+ latter.getStartTime());
} else {
System.out.println(former.getStartTime() + " to "
+ latter.getStartTime());
System.out.println(latter.getEndTime() + " to "
+ former.getEndTime());
}
}
} else if (TimeDate.Compare(former.getStartTime(), latter
.getStartTime()) == 0) {
if (TimeDate.Compare(former.getEndTime(), latter.getEndTime()) != 1) {
// do nothing
} else {
System.out.println(latter.getEndTime() + " to "
+ former.getEndTime());
}
} else {
if (TimeDate.Compare(former.getStartTime(), latter.getEndTime()) != -1) {
latterFlag = true;
} else {
if (TimeDate.Compare(former.getEndTime(), latter.getEndTime()) != 1) {
// do nothing
} else {
System.out.println(latter.getEndTime() + " to "
+ former.getEndTime());
}
}
}
return latterFlag;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<TimeDate> TimeDateArray1 = new ArrayList<TimeDate>();
TimeDateArray1.add(new TimeDate(2, 5));
TimeDateArray1.add(new TimeDate(7, 10));
TimeDateArray1.add(new TimeDate(12, 14));
ArrayList<TimeDate> TimeDateArray2 = new ArrayList<TimeDate>();
TimeDateArray2.add(new TimeDate(1, 3));
TimeDateArray2.add(new TimeDate(8, 9));

int i = 0, j = 0;
int m = TimeDateArray1.size();
int n = TimeDateArray2.size();
boolean result;
while (true) {
result = TimeMinus.calculateTimeMinus(TimeDateArray1.get(i),
TimeDateArray2.get(j));
if (result) {
if (j + 1 < n) {
j++;
} else {
break;
}
} else {
if (i + 1 < m) {
i++;
} else {
break;
}
}
}

if (i < m) {
for (; i < m; i++) {
System.out.println(TimeDateArray1.get(i));
}
}
}

}

java_qingchong 2009-03-19
  • 打赏
  • 举报
回复
顶一下顶一下顶一下
java_qingchong 2009-03-19
  • 打赏
  • 举报
回复
顶一下
grellen 2009-03-18
  • 打赏
  • 举报
回复
如果删掉一条记录后就,就从比它的下条记录的startTime小的时间开始找
grellen 2009-03-18
  • 打赏
  • 举报
回复
首先在List2中的startTime中找比list1的第一条记录中的startTime小的时间,如果找到,就用List2中的这条记录的endTime与List1中的endTime相比,如果比List1中的大就删掉这记录,如果比List1中的endTime小,就把List2中的endTime作为startTime,List1中的endTime作为endTime存入List中,如果没有找到,就继续从List2中的startTime中找比list1的第一条记录中的startTime大,但比endTime小的时间,以此类推,接着从从List2中的startTime中找比list1的第一条记录中的endTime大,但比第二条记录的startTime小的时间......
goodmrning 2009-03-18
  • 打赏
  • 举报
回复
把list1和list2中的元素都封闭成Date类型,然后调用Date中的compareTo()方法,根据返回值判断大小。
java_qingchong 2009-03-18
  • 打赏
  • 举报
回复
不明白楼上说的"小于"."大于"什么意思
goodmrning 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 java_qingchong 的回复:]
前提,两个list都是有序的按 startTime 升序排,若startTime 相等再按endTime排
[/Quote]
那就直接从这步开始:遍历list1,同时遍历list2,用两重循环,对list1的每一个元素与list2中的元素比较,如果小于则进入下一轮;如果大于等于就用list2中的那个元素取代list1中的,直到遍历完。
java_qingchong 2009-03-18
  • 打赏
  • 举报
回复
前提,两个list都是有序的按 startTime 升序排,若startTime 相等再按endTime排
goodmrning 2009-03-18
  • 打赏
  • 举报
回复
首先,对两个list进行排序,接着遍历list1,同时遍历list2,用两重循环,对list1的每一个元素与list2中的元素比较,如果小于则进入下一轮;如果大于等于就用list2中的那个元素取代list1中的,直到遍历完。
goodmrning 2009-03-18
  • 打赏
  • 举报
回复
首先,对两个list进行排序,接着遍历list1,同时遍历list2,用两重循环,对list1的每一个元素与list2中的元素比较,如果小于则进入下一轮;如果大于等于就用list2中的那个元素取代list1中的,直到遍历完。
java_qingchong 2009-03-18
  • 打赏
  • 举报
回复
汗...

例如: list1记录1中出现了2009.06.01 到 2009.06.05 的时间段
在list2记录1中有2009.06.03 到 2009.06.08 时间段
则求:list1的时间段除去在list2中出现过的时间段,结果是:2009.06.01到2009.06.03

list1与list2的差集
即:求list1中有,而list2中没有的数据

valen_jia 2009-03-18
  • 打赏
  • 举报
回复
没看懂

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧