Software Construction lab3 part2

具体问题集还是参照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));;

	}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值