HIT 软件构造21年春lab总结

Lab1

P2 convexHull

关于二维凸包的一个问题,一开始的想法是:先选定最右下角的点作为基点,然后如果下一个点在相对于以基点做的y轴的右侧则后续的点都得选取逆时针角度最大的点,直到回到基点。以上想法是由于之前写过一个计算两个向量转向的函数,而如果是逆时针的话就是角度大于180度,所以就相当于寻找旋转角最大的即可,不过实际操作起来发现时间复杂度过大,于是去寻找了相关的算法,发现了向量叉乘结果可以判断逆时针还是顺时针,于是陷入了沉思。
向量的叉乘究竟是如何判断逆时针还是顺时针,我查找了许多的参考资料都没有一个完整地解答这一个原理。我们知道,根据右手螺旋守则,逆时针方向的向量叉乘都指向同一侧,而顺时针都指向另一侧,个人猜测这个原理是个发现,由于发现逆时针叉乘结果都是正的,才规定叉乘结果是正就是逆时针,叉乘结果是负就是顺时针。

Lab2

在lab2中有许多新的发现。

迭代器删除

例如如果要删除容器里面的元素,例如:list,map,set。最好是使用迭代器来删除,因为如果用for循环来删除,假设当删去第i个元素时,后续的所有元素就会往前移动,第i+1变为i,i+2变为i+1……。而此时循环中的控制循环次数变量仍是i,且下一个循环就变为i+1,而我们本来的i+1元素已经到了第i个元素,所以会有漏删的可能性。这种时候我们就最好使用迭代器删除。然后迭代器中最难书写的就是Map了,需要在Map.Entry使用迭代器。

toString的益处

toString()函数在debug中的帮助。toString是为了让我们更好地理解一个ADT类,用人能听懂的话。当我们override了toString后,我们在debug时,我们的ADT变量就会用我们定义的toString来表示,如果我们没有toString,则该变量显示的就是内存地址,这不方便我们去理解内部的情况,所以后续在编写ADT时,最好先将toString完成。

AF,REP的理解

AF我的理解是用人的语言去描述ADT类型,让使用者可以听懂这个ADT是用来表示什么的。
REP我的理解是它声明了有什么变量,变量之间或者变量本身要满足什么关系。

参数输入类型的对比

在FriendshipGraph中,我将原本的参数输入从Person改为String,然后在方法内部再new出Person。这里是由于习题课的时候老师提过一嘴,采用基础数据类型的好处在于让客户端对我们内部的实现了解更少,这样子更有利于我们保护内部的数据。

Lab2

1.MultiIntervalSet对于IntervalSet的委派

在MultiIntervalSet中要求将IntervalSet作为我们的Rep,称为intervalSet,需要复用IntervalSet中已实现的类和功能。但是IntervalSet接口的实现类CommonIntervalSet是针对标签只有一个时间段的插入。那么问题来了,如果要在MultiIntervalSet中通过intervalSet来插入一个标签多个时间段就必须得重写MultiIntervalSet的标签。然而时间段的管理都在intervalSet这个我们的Rep中的成员变量中。

在这里插入图片描述

但是MultiIntervalSet正常来说是无法范文IntervalSet中的Rep,所以我们就需要将IntervalSet中的Rep返回出来,于是我增加了一个getIntervalSet的函数。

现在又有个问题了:当DutyIntervalSet继承了CommonIntervalSet,它就多了一个getIntervalSet函数,很显然在DutyIntervalSet类中,我们是不想把他的Rep返回给客户端,对于这个问题我的想法是将DutyIntervalSet的getIntervalSet重写为空,但是这个方法又不符合LSP原则了。
所以重写了MultiIntervalSet中的Rep,一开始的方法是将IntervalSet中的rep定义为Map<L, List<·Interval >>。现在我们将MultiIntervalSet中的Rep定义为List<·IntervalSet>。如果同一个标签有新的Interval就往List中add一个新的Interval。由此能很好地实现委派的任务。

关于周期性的疑惑

关于App1与App2,没有要求周期性。那么岂不本应该意味着App1和App2不论是否满足周期性都是正确的?而且App1本身便是一个标签一个时间段,从定义上一开始就不满足周期性。所以对于App1和App2我不去检验周期性,而对于App3由于要求满足周期性原则,所以如果经检验,不满足周期性我便抛出异常。
以上是我对周期性的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值