Re-implement the Social Network in Lab1
我们需要利用在P1中已经实现的Graph类来实现我们在第一次实验中所设计的人际关系实验P3。我们不能改变现有的规约,而只能在此基础之上,利用Graph为我们提供的方法来进行设计。
相似的,我们应该首先确定Person的定义,其次在确定FriendshipGraph的具体方法,最后通过广搜来确定distance的大小。
FriendshipGraph类
在这里,我们费劲千辛万苦实现的Graph就可以大显身手了。
我们将关系图声明为一个Graph类型的变量,由于已经泛化,我们可以将其中存储想要的Person类成员。首先先初始化,生成一个空图。
接下来要往里加点:(注意不能重复,因此利用迭代器检查一遍)
其次,要向图中加边:
加边比较容易,就是利用graph类中的set方法,要注意这里是无向图,而我们的方法是有方向的,因此要将Target和Source互换调用两次,weight赋值为1即可。
然后是返回graph的点的成员member,也非常容易实现,只需调用Graph.vertices()即可。这个方法主要是为了搜索时的遍历而单独声明。
最终是核心算法,利用广搜,可以计算最短路径,在这里不加赘述。
Person类
首先我们为了保护数据,以下的数据均定义为private类型。
对于每一个Person类对象person,定义private final String name来储存他的姓名,其次用private Boolean isVisited来标记是否在搜索时被访问过。随后定义几个需要的观察者方法,来获取person的name和isVisited标记,并对标记初始化的函数initial和改变标记的函数visit。
客户端main()
实验要求直接使用Lab1中的main函数,我们不加改动的将其复制过来即可,运行一下观察结果的正确性。
可以看到,这里的输出与我们标记的预计的输出是一致的,初步表明程序基本实现了预期的目标。
测试用例
测试用例主要关注于FriendshipGraph中的函数,而main函数主要起了调用的功能,因此无需测试。
对于加点,我们要考虑在空图中加新点,在已有非空图中添加新点,新点的name已经出现会报错,并终止程序。
对于加边,我们要考虑边的起始点不能相同,权值必须是正的。
对于计算距离,我们要考虑图中有环、联通性等对于距离的影响,包括自己到自己的距离等等,测试各种可能出现的情况,并验证实际值是否与理论值相同。
提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。