我在用着乔达时间 http://www.joda.org/joda-time/Java 中用于跟踪时间列表的库间隔 http://www.joda.org/joda-time/key_interval.html。我想检查是否有一个列表Interval http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html对象完全覆盖一个月的每一分钟。大约有 30 个时间间隔,长度从几小时到几天不等。
我认为一种便宜的方法是按开始时间对间隔列表进行排序,然后连续检查月份范围内的间隔之间是否存在中断。如果是,则该月未完全覆盖。
我陷入了第一部分,对列表进行排序。我计划使用Arrays http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html.sort(),但它需要元素来实现类似的接口。然而,在查看了源代码之后,Joda-Time 的 Interval 类似乎没有一个我可以重写的类,而且我无法扩展它来编写自己的compareTo 方法。
除了编写我自己的排序方法之外,有人知道更简单的方法来完成此任务吗?谢谢
您可以使用Collections#sort http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List,%20java.util.Comparator%29 with a Comparator http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html对时间间隔进行排序并使用Interval#gap http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html#gap%28org.joda.time.ReadableInterval%29检查是否有间隙。如果 start 和 end 之间的时间间隔完全被 timeIntervals 覆盖,以下代码将返回 true:
public static boolean isCovered(List<Interval> timeIntervals, DateTime start, DateTime end) {
if (timeIntervals.isEmpty()) {
return false;
}
// create sorted set from original List to get
// sorted intervals without double entries
Set<Interval> intervalSet = new TreeSet<>(new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
return o1.getStart().compareTo(o2.getStart());
}
});
intervalSet.addAll(timeIntervals);
List<Interval> intervals = new ArrayList<>(intervalSet);
// remove intervals completely contained in others
List<Interval> removedIntervals = new ArrayList<>();
for (int i = 0; i < (intervals.size()-1); i++) {
for (int j = (i+1); j < intervals.size(); j++) {
if (intervals.get(i).contains(intervals.get(j))) {
if (!removedIntervals.contains(intervals.get(j))) {
removedIntervals.add(intervals.get(j));
}
}
}
}
intervals.removeAll(removedIntervals);
if (intervals.get(0).getStart().isAfter(start) ||
intervals.get(intervals.size() - 1).getEnd().isBefore(end)) {
return false;
}
// check for gaps
for (int i = 0; i < (intervals.size() - 1); i++) {
Interval gap = intervals.get(i).gap(intervals.get(i+1));
if (gap != null && new Interval(start, end).overlaps(gap)) {
// gap detected between interval i and interval (i+1)
return false;
}
}
return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)