不多说了直接看代码吧,代码注释我感觉很清晰
主要思路还是获得最长区间以及空闲时间
空闲时间长度的获取的思路还是括号匹配
具体可以看参考blog
time类的实现
public class time implements Comparable<time> {
private long startTime;
private long endTime;
private void checkRep() {
assert startTime >= 0;
assert endTime >= startTime;
}
public int compareTo(time tmp) {
int result = ((Long) this.start()).compareTo((Long) tmp.start());
if(result==0) {
int result2 = ((Long)this.end()).compareTo((Long)tmp.end());
return result2;}
return result;
}
public time(long startTime, long endTime) {
this.startTime = startTime;
this.endTime = endTime;
checkRep();
}
public long start() {
return startTime;
}
public long end() {
return endTime;
}
}
最终代码
public double calcFreeTimeRatio(MultiIntervalSet<L> set) {
TreeSet<time> totalSet = new TreeSet<>();
Iterator<L> iterator = set.labels().iterator();
while(iterator.hasNext())
{
totalSet.addAll(set.intervals(iterator.next()));//不论是否重叠直接加入
}
double min,max = totalSet.first().end(),sum = 0;//将第一个区间的起始点记录,并存入
min=totalSet.first().start();
//System.out.println(totalSet.first().start()+"sdf"+totalSet.first().end());
totalSet.remove(totalSet.first());//移除第一个区间
//System.out.println(totalSet.first().start()+"sdf"+totalSet.first().end());
Iterator<time> iterator2 = totalSet.iterator();
while (iterator2.hasNext()) {//从第二个区间开始迭代
time tmp = iterator2.next();
double timeS,timeE;
timeS = tmp.start();
timeE = tmp.end();
double tmpS = timeS-max;//计算下一个区间的起点与上一个区间的终点
if(tmpS>0) {
sum+=tmpS;
}
max = timeE;//更新区间
}
return sum/(max-min);
}
参考地址:
https://blog.csdn.net/qq_58952489/article/details/118386485