具体问题集还是参照mit
Multi-Startup Set
接上一个
添加链接描述
接下来我们实现
MultiIntervalSet
IntervalSet与MultiIntervalSet的区别:
IntervalSet:每个时间段附着一个特定的标签,且标签不重复。
MultiIntervalSet:一个标签可以绑定到多个时间段
所以在IntervalSet的插入函数:需要检查标签是否重复加入
MultiIntervalSet:一个标签可以绑定到多个时间段
所以直接基于IntervalSet稍加一些修改即可
接口
import IntervalSet.IntervalSet;
import java.util.Set;
public interface MultiIntervalSet<L> {
//创建一个空对象:
public static <L> MultiIntervalSet<L> empty(){
return (MultiIntervalSet<L>) new CommonMultiIntervalSet();
}
//在当前对象中插入新的时间段和标签:
public void insert(long start, long end, L label);
//获得当前对象中的标签集合:
public Set<L> labels();
//从当前对象中移除某个标签所关联的时间段:
public boolean remove(L label);
//从 当 前 对 象 中 获 取 与 某 个 标 签 所 关 联 的 所 有 时 间 段
public IntervalSet<Integer> intervals(L label);
}
package MultiIntervalSet;
import IntervalSet.Interval;
import IntervalSet.IntervalSet;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CommonMultiIntervalSet<L> implements MultiIntervalSet<L> {
List<Interval<L>> intervals=new ArrayList<>();
//
public void checkrep(){
}
//在当前对象中插入新的时间段和标签:
//spec:具有相同 label 的多个 interval 之间仍不允许有重叠,某个时间点只能属于一个时间段
//AF:
//不允许时间之间有重叠,某个时间点只能属于一个时间段
public void insert(long start, long end, L label) {
int i=0;
for(i=0;i<intervals.size();i++) {
if (label.equals(intervals.get(i).getlabel())){
if(start<=intervals.get(i).getMin()&&end>=intervals.get(i).getMax()){
System.out.println("具有相同 label 的多个 interval 之间不允许有重叠,某个时间点只能属于一个时间段");
return;
}
}
}
Interval<L> l= new Interval(start,end,label);
intervals.add(l);
return;
}
//获得当前对象中的标签集合:
public Set<L> labels(){
Set<L> labels=new HashSet<L>();
for (int i = 0; i < intervals.size(); i++) {
labels.add((L) intervals.get(i).getlabel());
}
return (Set<L>) labels;
}
//从当前对象中移除某个标签所关联的时间段:
//
public boolean remove(L label) {
int n=intervals.size();
for (int i = 0; i < intervals.size(); i++) {
if (intervals.get(i).getlabel() == label) {
intervals.remove(i);
}
}
if(intervals.size()<n)
{
return true;
}
else {
return false;
}
}
//从 当 前 对 象 中 获 取 与 某 个 标 签 所 关 联 的 所 有 时 间 段
public IntervalSet intervals(L label){
IntervalSet<Integer> multi=IntervalSet.empty();
Integer j=0;
for(int i=0;i<intervals.size();i++) {
if(intervals.get(i).getlabel()==label) {
multi.insert(intervals.get(i).getMin(),intervals.get(i).getMax(),j);
j++;
}
}
return (IntervalSet<Integer>)multi;
}
}
测试
package MultiIntervalSet;
import static org.junit.Assert.assertEquals;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import IntervalSet.*;
public class CommonMultiIntervalSetTest {
//标签是否成功加入
//@SuppressWarnings("unchecked")
@Test
public void testinsert() {
MultiIntervalSet test1 = MultiIntervalSet.empty();
test1.insert(1, 5, "xyn");
test1.insert(6, 10, "xyn");
IntervalSet<Integer> test = IntervalSet.empty();
test.insert(1, 5, 0);
test.insert(6, 10, 1);
IntervalSet<Integer> temp = IntervalSet.empty();
temp = test1.intervals("xyn");
assertEquals(test.labels(), temp.labels());
//Integer j=0;
//Set<Integer> labels=new HashSet<Integer>();
//labels=test.labels();
assertEquals(test.getinterval(0), temp.getinterval(0));
assertEquals(test.getinterval(1), temp.getinterval(1));
}
@Test
//获得当前对象中的标签集合:是否存在
public void testlabels() {
Set<String> labels=new HashSet<>();
MultiIntervalSet test1=MultiIntervalSet.empty();
test1.insert(1,5,"xyn");
test1.insert(1,5,"kk");
labels.add("xyn");
labels.add("kk");
assertEquals(labels,test1.labels());
}
@Test
//获得当前对象中的标签集合:是否存在
public void testremove(){
MultiIntervalSet test1=MultiIntervalSet.empty();
test1.insert(4, 6, "ngu");
test1.insert(2, 3, "ngu");
assertEquals(true,test1.remove("ngu"));
assertEquals(false,test1.remove("ng"));
}
@Test
public void testintervals(){
MultiIntervalSet test1 = MultiIntervalSet.empty();
test1.insert(1, 5, "xyn");
test1.insert(6, 10, "xyn");
IntervalSet<Integer> test = IntervalSet.empty();
test.insert(1, 5, 0);
test.insert(6, 10, 1);
IntervalSet<Integer> temp = IntervalSet.empty();
temp = test1.intervals("xyn");
assertEquals(test.labels(), temp.labels());
//Integer j=0;
//Set<Integer> labels=new HashSet<Integer>();
//labels=test.labels();
assertEquals(test.getinterval(0), temp.getinterval(0));
assertEquals(test.getinterval(1), temp.getinterval(1));;
}
}