本环节给出了一个Graph接口,要求我们秉承测试驱动开发的思想,分别建立继承graph接口的边图类、点图类,并且在类中具体实现操作graph的一系列方法。另外,我们需要在类中具体实现Edge或Vertex数据型,在完成之后,用我们设计的图的抽象数据型完成poetic walks的工作。这一环节的主要目的是动手实践ADT的规约设计并具体设计、实现ADT。
-
-
- Problem 1: Test Graph <String>
-
-
-
-
- Implement ConcreteEdgesGraph
-
-
- 实现edge类:
AF、RI与防止Rep泄露的安全措施如下:
CheckRep()如下,检查权值是否都大于0,以及有起点和终点
该类成员变量:
,都用private final修饰这是为了防止表示泄露
其中的构造方法和各个方法的实现。
按source->target(weight)要求打印边的内容
- 实现ConcreteEdgesGraph
AF、RI与防止Rep泄露的安全措施如下:
为了防止表示泄露,在调用各个方法返回之前,使用checkRep方法检查是否有表示泄露的情况出现,具体实现以RI为原则:
这是它的checkup方法
这是其成员变量
Add方法:
将vertex放入vertices
Set方法
为了能实现set中的remove方法,这里需要使用迭代器遍历边集。
Remove方法
这是经过idea优化过的,idea使用了removeif实现它。
Vertices sources targets方法
其中vertices方法应该返回一个新的集合,为了防止表示泄露。
sources方法新建了一个名为sourceweight的map返回。
Targets与之类似。
打印图的内容。
下面来看ConcreteEdgeGraphTest的实现
先对是否能形成图进行test,对三个点进行构建。
其次是对getsource和gettarget的test比较返回的点名即可
-
-
-
- Implement ConcreteVerticesGraph
-
-
- vertex类的实现
AF、RI与防止Rep泄露的安全措施如下:
这是其chekup
对父节点和子节点中的权值进行遍历,确保值均大于0.
它的成员变量
均用private final修饰,为了防止表示泄露,mark作为点名字,marksoure作为其所有父节点和边权值的map,marktarget作为其所有子节点和边权值的map,
返回点名和返回父节点集合和子节点集合,其中为了避免表示泄露,返回的是一个新的hashmap。
Addsource方法,
为当前点添加父节点
若父节点已存在,则更新权值;若父节点不存在,为当前点加上一个父节点以及边
若weight为0,则移除父节点
vertices返回顶点集
sources这里进行了防御式拷贝
ConcreateGraphVerticesTest的实现
toString方法
检测是否能形成图,三个点。
-
-
-
- Implement Graph.empty()
-
-
使用Collections类的empty,emptylist,emptyset生成空的对象进行比较。
覆盖率运行结果.
实现一个类,利用之前实现的图结构,能够将文本中的文字转化为该种图结构,并且在图中搜索,完成对输入的句子的扩充。
-
-
-
- Test GraphPoet
-
-
// Testing strategy
// 一、不同权值语料考察输出是否正确
//1、出现空语料
//2、出现权值不同,需要比较的语料
//3、均是为1权值的语料
//二、同一个语料考察不同input
//1、空语句
//2、带标点
//3、不带标点
-
-
-
- Implement GraphPoet
-
-
AF,RI, Safety from rep exposure,如上图。
GraphPoet的实现
设计思路是将所有文本按空格分开,去掉附近的标点,全部小写后放入一个list,然后每次遍历两个单词,这两个单词如果有边了就增加权值,没有就加一条边。
Poem的实现
想法是每次对遍历的两个词作去标点和进行小写变换,然后对前一个点的子节点进行遍历,如果有点既是其子节点又是其后一个词的父节点,就先记录它,同时需要对权值进行遍历,选出最大的,同时要考虑到在循环内无法将input的最后一个词加入返回的字符串,所以需要最后特别加入它。
测试策略。
Test的实现内容
AF、RI、safety from rep exposure如图
成员变量,这里在idea里需要在P2模块的依赖增加P1
构造方法
这里进行加点和加边的操作,其中加边操作考虑到在这个问题中实际是无权图,故所有边均记权值为1,用set方法实现。
获取距离函数,这里主要就是把lab1中的距离函数做了一点修改,同样是使用广度优先搜索,new一个map来保存所有点到起点的distance,new一个queue来作为队列,起点先入队,然后出队,遍历子节点并且更新map,记录子节点到自己的距离,同时子节点入队,然后重复出队更新map的操作,其中只对为加入map的点做更新。
和之前lab1的输出一样
给出你的设计和实现思路/过程/结果。
Person类完全复制了lab1的person类。
在person里的成员变量:
Myfriends是存放这个person对象的朋友,allpeople存放当前以出现的人避免重名所以是静态,myname是该对象名字。
构造方法
对未出现的Person加入allpeople,出现过的直接打印错误并且结束程序,Person的名字为传入的字符。
给出你的设计和实现思路/过程/结果。
-
-
- 客户端main()
-
同样是完全复制了上一次的main函数,和上一次要求相同的设计了几个Person,构成图,
以此进行了长度为1(起点到终点距离为1)、2(起点到终点距离为2)、0(到自身)、-1(不存在回路)的输出,最后对一个同样的人再次创建person类,能看到报错。
给出你的设计和实现思路/过程/结果。
对上一次的测试用例稍作修改
创建图,依次测试是否正确添加顶点。
创建图,依次测试能否正常增加边
测试distance方法,创建图,依次测试是否能正确输出路径长度
这是其test strategy
测试peoson类里方法的功能.
覆盖率测试是100%.